获取 PictureBox 控件中的图像,其中包含使用图形对象绘制的线条

本文关键字:对象 图形 绘制 控件 PictureBox 图像 获取 包含使 | 更新日期: 2023-09-27 18:35:08

我很难理解图形对象的绘制方式。假设有这个函数:

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 控件中的图像,其中包含使用图形对象绘制的线条

如果您希望能够保存图形,则需要在表面上绘制它们,然后保存表面。通常,在画布上绘图不会让您保存图像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);