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

24

我有一个已经在屏幕上绘制的 Graphics 对象,需要将其保存到 png 或 bmp 文件中。Graphics 似乎不支持直接完成此操作,但肯定有某种方式可以实现。

步骤是什么?

5个回答

31

以下是代码:

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

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

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

   e.Graphics.DrawImage(bitmap, 0, 0);
}

另外,如果想要在网页上节省空间,您可以使用以下代码:

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

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

图形对象是 GDI+ 绘图表面。它们必须有一个附加的设备上下文以便绘制,即一个窗体或图像。


9
我不认为这个答案回答了问题,问题是将一个GRAPHICS对象复制到位图中。这段代码似乎做的是相反的操作。(我遇到了这样的情况:一个“Graphics”被传递到一个方法中,但是在代码的那个位置上,“Graphics”的来源不可访问,只有“Graphics”本身。) - ToolmakerSteve

9

将其复制到一个Bitmap中,然后调用位图的Save方法。

请注意,如果您正在通过获取屏幕的设备上下文来直接绘制到屏幕上,则保存您刚刚绘制到屏幕上的内容的唯一方法是通过从屏幕Bitmap绘制并反转该过程。这是可能的,但显然直接使用相同的代码绘制到位图中会更加容易。


12
针对未来的读者:尽管这个问题的标题是如何将任意图形对象保存为图像,但该答案并没有展示如何实现。也就是说,在 Graphics 或 Bitmap 中没有一个函数可以"将它(Graphics 实例)复制到 Bitmap"。从最后一句话来看,可能是指使用 Graphics g = Graphics.FromImage(bitmap),然后渲染到图形(g)上,而不是你原始的图形对象。接下来,您可以使用 bitmap.Save 来保存您所呈现的内容。 - ToolmakerSteve

6

试试这个,我用起来很好用...

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)
    {
        //
    }
}

那真的会创建一个PNG文件吗?看起来你只是将位图保存为带有PNG扩展名的文件? - Shiv

1
Graphics graph = CreateGraphics();
Bitmap bmpPicture = new Bitmap("filename.bmp");

graph.DrawImage(bmpPicture, width, height);

1

你可能正在绘制图像或控件。如果是在图像上,请使用

    Image.Save("myfile.png",ImageFormat.Png)

如果在控件上绘制,请使用Control.DrawToBitmap(),然后像上面那样保存返回的图像。
谢谢您的纠正 - 我不知道您可以直接绘制到屏幕上。

你可以使用Graphics直接在屏幕上绘制,它有一个构造函数,需要一个设备上下文作为参数 - 你只需要获取屏幕的设备上下文即可。 - MusiGenesis
谢谢你,我从来没有想过直接在屏幕上绘制! - filip-fku
我实际上建议不要直接在屏幕上绘制,因为这样做真的没有意义。 - MusiGenesis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接