将System.Drawing.Graphics保存到png或bmp

Old*_*Man 20 c# graphics

我有一个我在屏幕上绘制的Graphics对象,我需要将其保存到png或bmp文件中.图形似乎不直接支持,但必须以某种方式.

步骤是什么?

Cur*_*lop 24

这是代码:

Bitmap bitmap = new Bitmap(Convert.ToInt32(1024), Convert.ToInt32(1024), System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bitmap);

// Add drawing commands here
g.Clear(Color.Green);

bitmap.Save(@"C:\Users\johndoe\test.png", ImageFormat.Png);
Run Code Online (Sandbox Code Playgroud)

如果您的图形在表单上,​​您可以使用:

private void DrawImagePointF(PaintEventArgs e)
{
   ... Above code goes here ...

   e.Graphics.DrawImage(bitmap, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)

此外,要保存在网页上,您可以使用:

MemoryStream memoryStream = new MemoryStream();
bitmap.Save(memoryStream, ImageFormat.Png);
var pngData = memoryStream.ToArray();

<img src="data:image/png;base64,@(Convert.ToBase64String(pngData))"/>
Run Code Online (Sandbox Code Playgroud)

图形对象是GDI +绘图表面.它们必须具有附加的设备上下文来绘制,即表单或图像.

  • 我没有看到这是如何回答问题的,即采用GRAPHICS对象,并将其复制到位图中.这段代码似乎做了OPPOSITE.(我有一种情况,一个"图形"被传递给一个方法,并且"图形"的源不能在代码中的那个地方访问,只有"图形"本身.) (7认同)

Mus*_*sis 8

将其复制到a Bitmap然后调用位图的Save方法.

需要注意的是,如果你从字面上绘制到屏幕(通过抓取屏幕的设备上下文),那么唯一的办法救你刚才画的屏幕是通过绘制的逆过程,从屏幕一个Bitmap.这是可能的,但直接绘制到Bitmap(使用与绘制到屏幕相同的代码)显然要容易得多.

  • 对于未来的读者:尽管这个问题的标题,这个答案没有显示如何将任意图形对象保存到图像.也就是说,在图形或位图中没有"将它(图形实例)复制到位图"的功能.从最后一句开始,它可能指的是做`Graphics g = Graphics.FromImage(bitmap)`,然后渲染****图形(g),而不是你的原始图形对象.然后你可以做bitmap.Save来保存你渲染的内容. (9认同)

小智 5

试试这个,对我来说很好...

private void SaveControlImage(Control ctr)
{
    try
    {
        var imagePath = @"C:\Image.png";

        Image bmp = new Bitmap(ctr.Width, ctr.Height);
        var gg = Graphics.FromImage(bmp);
        var rect = ctr.RectangleToScreen(ctr.ClientRectangle);
        gg.CopyFromScreen(rect.Location, Point.Empty, ctr.Size);

        bmp.Save(imagePath);
        Process.Start(imagePath);

    }
    catch (Exception)
    {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)