我试图在c#中为我的大学项目制作一个类似Photoshop的应用程序 到目前为止,我创建了一个名为canvas的自定义面板,并重载了paint方法以绘制canvasBuffer。 该项目被称为油漆锐利。 我有一个Class PaintSharpFile,用于存储图像的各个层。 在Canvas控件上,我绘制选中的Transparent Background,然后绘制paint sharp文件中的图层到canvasBuffer。我终于画了这个缓冲区(Double Buffering)。
现在,我正在编写画笔工具的代码。 我记录了前一个和当前的点,然后在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();
}
}
请告诉我如何阻止涂料滞后。
我曾尝试制作几张带有图层图像的画布。但由于它不是双缓冲的,它会导致闪烁。
答案 0 :(得分:0)
对我而言,最重要的是你在每次更新时复制整个图层。尝试将复制限制在受影响的区域。
与性能无关,您直接在Graphics对象上调用Dispose,但不会丢弃您创建的Brush和Pen对象。 using
块有什么问题?