Ich habe ein kleines Malprogramm, an dem ich gerade arbeite. Ich verwende SetPixel auf einer Bitmap, um die Linien zu zeichnen. Wenn die Pinselgröße groß wird, etwa 25 Pixel, gibt es einen spürbaren Leistungsabfall. Ich frage mich, ob es einen schnelleren Weg gibt, um in eine Bitmap zu zeichnen. Hier ist ein wenig der Hintergrund des Projekts:
- Ich verwende Bitmaps, damit ich Ebenen verwenden kann, wie in Photoshop oder GIMP.
- Die Linien werden manuell gezeichnet, da der Druck des Grafiktabletts verwendet wird, um die Größe der Linie über ihre Länge zu verändern.
- Die Linien sollten schließlich an den Rändern geglättet/entschärft werden.
Ich füge meinen Zeichencode bei, nur für den Fall, dass dies langsam ist und nicht das Set-Pixel-Bit.
Dies ist das Fenster, in dem die Malerei stattfindet:
private void canvas_MouseMove(object sender, MouseEventArgs e)
{
m_lastPosition = m_currentPosition;
m_currentPosition = e.Location;
if(m_penDown && m_pointInWindow)
m_currentTool.MouseMove(m_lastPosition, m_currentPosition, m_layer);
canvas.Invalidate();
}
Implementierung von MouseMove:
public override void MouseMove(Point lastPos, Point currentPos, Layer currentLayer)
{
DrawLine(lastPos, currentPos, currentLayer);
}
Implementierung von DrawLine:
// The primary drawing code for most tools. A line is drawn from the last position to the current position
public override void DrawLine(Point lastPos, Point currentPos, Layer currentLayer)
{
// Creat a line vector
Vector2D vector = new Vector2D(currentPos.X - lastPos.X, currentPos.Y - lastPos.Y);
// Create the point to draw at
PointF drawPoint = new Point(lastPos.X, lastPos.Y);
// Get the amount to step each time
PointF step = vector.GetNormalisedVector();
// Find the length of the line
double length = vector.GetMagnitude();
// For each step along the line...
for (int i = 0; i < length; i++)
{
// Draw a pixel
PaintPoint(currentLayer, new Point((int)drawPoint.X, (int)drawPoint.Y));
drawPoint.X += step.X;
drawPoint.Y += step.Y;
}
}
Implementierung von PaintPoint:
public override void PaintPoint(Layer layer, Point position)
{
// Rasterise the pencil tool
// Assume it is square
// Check the pixel to be set is witin the bounds of the layer
// Set the tool size rect to the locate on of the point to be painted
m_toolArea.Location = position;
// Get the area to be painted
Rectangle areaToPaint = new Rectangle();
areaToPaint = Rectangle.Intersect(layer.GetRectangle(), m_toolArea);
// Check this is not a null area
if (!areaToPaint.IsEmpty)
{
// Go through the draw area and set the pixels as they should be
for (int y = areaToPaint.Top; y < areaToPaint.Bottom; y++)
{
for (int x = areaToPaint.Left; x < areaToPaint.Right; x++)
{
layer.GetBitmap().SetPixel(x, y, m_colour);
}
}
}
}
Vielen Dank für jede Hilfe, die Sie anbieten können.