我很难理解图形对象的绘制方式。假设有这个函数:
private void DrawLineOnOverlay()
{
using (var g = pictureBox.CreateGraphics())
{
g.DrawLine(OverlayPen, cursorStartx, cursorStarty, cursorEndx, cursorEndy);
}
}
要在已经执行此操作的 pictureBox 控件中绘制简单线条,请执行以下操作:
pictureBox.Image = BitmapToBeLoaded; // Load an 8-bit indexed Bitmap
我的理解是,加载的图像和使用图形对象绘制的像素都是同一图像的一部分:pictureBox.Image
但是这个:
Bitmap graphic = pictureBox.Image;
if (graphic != null )
{
graphic = new Bitmap (pictureBox.Image);
graphic.Save( "C:\packed.png", ImageFormat.Png);
}
不起作用:保存的图像不显示图像上以红色绘制的线条。为什么会这样?怎么了?
如果您希望能够保存图形,则需要在表面上绘制它们,然后保存表面。通常,在画布上绘图不会让您保存图像PictureBox
因为Image
类与绘图无关。 Image
只是Bitmap
之上的一个抽象类,它能够加载GDI+支持的图像文件,然后将其呈现在PictureBox
中。绘图是在Graphics
对象的 GDI+ 绘图图面上完成的。
您可以创建曲面:
Bitmap surface = new Bitmap(640, 480);
Graphics g = Graphics.FromImage(surface);
using (var OverlayPen = new Pen(Color.Red))
{
g.DrawLine(OverlayPen, cursorStartx, cursorStarty, cursorEndx, cursorEndy);
}
如果要显示图纸,可以Surface
设置为 PictureBox
的图像。请记住,在创建笔或画笔等图形对象时using
使用模式,因为如果不这样做,它们将一直保留在内存中,直到上下文的末尾,并且它们可能会导致某些点溢出。
要保存然后:
surface.Save( "C:\packed.png", ImageFormat.Png);