这是我正在做的事情的一些伪代码。一切正常,但后来我试图保存我的结果。保存也可以,但图像结果是透明的。知道是什么会导致这种奇怪的行为吗?
static Graphics G = Panel.CreateGraphics();
//some painting -> shows up correctly on the panel
Bitmap bitmap = new Bitmap(500, 500, G);//bitmap is transparent!
bitmap.Save("path/test1.png", System.Drawing.Imaging.ImageFormat.Png);
您正在使用的 Bitmap
构造函数的文档说:
使用指定的大小和指定图形对象的分辨率初始化位图类的新实例。
这意味着它只是从Bitmap
获得分辨率。它不会向位图绘制任何内容。要么使用Graphics.FromImage
,要么如Hans Passant所提到的,使用Control.DrawToBitmap
方法。
我个人的偏好,如果我需要同时绘制屏幕和位图,将是创建一个进行绘画的方法(将Graphics
对象作为参数)。然后,我可以在 Paint
事件处理程序中调用它,或者从其他代码中调用它以生成位图。
另外,一般来说,永远不要使用 Control.CreateGraphics
.正确的绘制方法是在控件的Paint
事件中。
这将绘制位图,但不会显示在面板中。如果显示是必需的,则必须在 Paint 事件上实现它。
Bitmap bmp = new Bitmap(Panel.Width, Panel.Height);
Panel.DrawToBitmap(bmp, new Rectangle(0, 0, Panel.Width, Panel.Height));
Graphics grp = Graphics.FromImage(bmp);
Pen selPen = new Pen(Color.Blue);
grp.DrawRectangle(selPen, 10, 10, 50, 50);
bmp.Save("d:\check3.png", System.Drawing.Imaging.ImageFormat.Png);