SetPixel ist zu langsam. Gibt es einen schnelleren Weg zu ziehen, um zu bitmap?

Ich habe ein kleines paint Programm ich arbeite. Ich bin mit SetPixel auf ein bitmap zu tun, dass die Zeichnung der Linien. Wenn die Größe des Pinsels wird groß, wie die 25 Pixel über gibt es eine spürbare performance-drop. Ich Frage mich, ob es eine schnellere Möglichkeit zum zeichnen in ein bitmap. Hier ist ein bisschen der hintergrund des Projekts:

  • Ich bin mit bitmaps, so dass ich verwenden können Ebenen, wie in Photoshop oder GIMP.
  • Linien sind gezeichnet von Hand eingeben, denn dieser wird letztendlich Grafiktablett den Druck zu ändern, die Größe der line-über seine Länge.
  • Die Linien sollen schließlich werden anti-aliaced/geschliffen, an den Kanten.

Ist, werde ich meine Zeichnung code nur für den Fall, es ist diese, die langsam ist und nicht die Set-Pixel-bit.

Dies ist in dem Fenster, wo die Malerei passiert:

    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();
    }

Umsetzung von MouseMove:

    public override void MouseMove(Point lastPos, Point currentPos, Layer currentLayer)
    {
        DrawLine(lastPos, currentPos, currentLayer);
    }

Umsetzung 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;
        }
    }

Umsetzung 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 können Sie bereitstellen.

InformationsquelleAutor Pyro | 2011-10-14

Schreibe einen Kommentar