SetPixel est trop lent. Existe-t-il un moyen plus rapide de dessiner sur bitmap?

J'ai un petit programme de dessin que je suis en train de travailler sur. Je suis à l'aide de SetPixel sur un bitmap à faire pour que le dessin des lignes. Lorsque la taille de la brosse est grande, à l'instar de 25 pixels à travers, il est notable de la chute des performances. Je me demande si il existe un moyen plus rapide de faire une image bitmap. Ici c'est un peu du contexte du projet:

  • Je suis en utilisant des images pour que je puisse utiliser des couches, comme dans Photoshop ou The GIMP.
  • Lignes sont dessinées manuellement car ce sera finalement l'utilisation de la tablette graphique de la pression de modifier la taille de la ligne sur toute sa longueur.
  • Les lignes devraient finalement être anti-aliaced/lissé sur les bords.

Je vais l'inscrire mon code de dessin juste au cas où c'est ce qui est lent et non pas sur l'Ensemble de Pixels bits.

C'est dans les fenêtres où la peinture se passe:

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

Mise en œuvre de MouseMove:

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

Mise en œuvre de 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;
        }
    }

Mise en œuvre de 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);
                }
            }
        }
    }

Merci beaucoup pour toute aide que vous pouvez fournir.

source d'informationauteur Pyro