【问题标题】:Getting the image in a PictureBox control with the lines drawn using a graphics object使用图形对象绘制线条在 PictureBox 控件中获取图像
【发布时间】:2013-10-11 19:55:05
【问题描述】:

我无法理解图形对象的绘制方式。假设有这个功能:

private void DrawLineOnOverlay()
{
        using (var g = pictureBox.CreateGraphics())
        {
            g.DrawLine(OverlayPen, cursorStartx, cursorStarty, cursorEndx, cursorEndy);
        }         
}

在您已经完成此操作的图片框控件中绘制简单的线条:

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

不起作用:保存的图像没有在图像上显示以红色绘制的线条。为什么这个?怎么了?

【问题讨论】:

    标签: c# image


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多