优化绘图以缓冲C#

本文关键字:缓冲 绘图 优化 | 更新日期: 2023-09-27 18:29:38

我正试图为我在c语言中的大学项目制作一个类似photoshop的应用程序#到目前为止,我已经创建了一个名为canvas的自定义面板,并重载了绘制方法来绘制canvasBuffer。这个项目被称为油漆锋利。我有一个类PaintSharpFile,它存储图像的各个层。在Canvas控件上,我绘制选中的透明背景,然后将绘制锐化文件中的层绘制到canvasBuffer上。我最后画了这个缓冲区(双缓冲)。

现在,我正在为画笔工具编写代码。我记录上一个点和当前点,然后在canvasBuffer上使用Bresenham的线算法在这两个点之间画一系列圆。这似乎很快而且很好。

现在,由于笔刷工具将在选定的活动层上工作,我尝试将点绘制到层的缓冲区。然后绘制所有图层的缓冲区canvasBuffer。这样做会使绘图非常缓慢。

这是代码

    public void PSF_Painted(PSF_PaintEvent e) 
    {
        Graphics g = null;
        Bitmap layerBuffer = psf.Layers[0].LayerBuffer;//Get selected layer here
        g = Graphics.FromImage(layerBuffer);
        Brush blackBrush = new SolidBrush(Color.Black);
        Pen blackPen = new Pen(blackBrush);
        blackPen.Width = 2;
        List<Point> recordedPoints = e.RecordedPoints;
        Point currentPoint = new Point(0,0);
        Point previousPoint = new Point(0, 0); ;
        if(recordedPoints.Count > 0)
        {
            currentPoint = recordedPoints[recordedPoints.Count - 1];
            if(recordedPoints.Count == 1)
            {
                previousPoint = recordedPoints[0];
            }
            else
            {
                previousPoint = recordedPoints[recordedPoints.Count - 2];
            }
        }
        if (e.PaintEventType == PSF_PaintEvent.Painting)
        {
            List<Point> points = Global.GetPointsOnLine(previousPoint.X, previousPoint.Y, currentPoint.X, currentPoint.Y);
            for (int i = 0; i < points.Count ; i++)
            {
                g.FillEllipse(blackBrush, new Rectangle(points[i].X, points[i].Y, (int)blackPen.Width, (int)blackPen.Width));
            }
        }
        Global.drawToBuffer(canvasBuffer, layerBuffer);//Replaced with redraw the full picture from the List of layer to the canvasBuffer
        g.Dispose();
        this.Invalidate();
    }

这是我的onPaint代码

    protected override void OnPaint(PaintEventArgs e) 
    {
        if (canvasBuffer != null)
        {
            Graphics g = e.Graphics;
            g.DrawImage(canvasBuffer, e.ClipRectangle, e.ClipRectangle, GraphicsUnit.Pixel);
            g.Dispose();
        }
    }

这是缓冲区的图片

public static void drawToBuffer(Bitmap buffer, Bitmap image)
    {
        if (image != null && buffer != null)
        {
            Graphics g = Graphics.FromImage(buffer);
            g.DrawImage(image, new Rectangle(0, 0, buffer.Width, buffer.Height));
            g.Dispose();
        }
    }

请告诉我怎样才能防止油漆掉渣。

我试着制作了几幅画布,每幅都有一层图像。但由于它不是双重缓冲的,它会导致闪烁。

优化绘图以缓冲C#

我想到的主要问题是,每次更新都要复制整个层。尝试将复制限制在受影响的区域。

与性能无关,您直接对Graphics对象调用Dispose,但不处理您创建的Brush和Pen对象。using块有什么问题?