将面板保存到位图 c# Winforms



我有一个图形对象和一个面板。图形对象使用面板中的处理程序进行实例化。然后,使用"绘制"操作更新面板。在"绘制"操作中,图形对象用于绘制。有时在代码中,我使用 Invalidate() 来更新面板。

我想将图形对象的内容或面板的内容保存到文件中。每当我尝试这样做时,都会创建图像文件,但为空白。

以下是代码的一些片段:

我将图形对象作为类变量启动:

Graphics GD_LD;

然后在构造函数中,我使用以下内容使用面板处理程序实例化对象:

GD_LD = Graphics.FromHwnd(panelDrawLD.Handle);

然后,我有了用于面板的"绘画"操作的绘图功能,如果我使用图形对象来制作所有绘图:

private void panelDrawLD_Paint(object sender, PaintEventArgs e)
{
..... some code ....
//Code example
GD_LD.FillPolygon(blackBrush, getPoints(min, sizeGP, scaleX, scaleY));
GD_LD.FillPolygon(blackBrush, getPoints(max, sizeGP, scaleX, scaleY));
..... some code ....
}

以上方法可以在面板中绘制并始终与图纸保持在一起。

尝试将面板保存到图像文件时出现问题:

Bitmap I_LD = new Bitmap(panelDrawLD.Size.Width, panelDrawLD.Size.Height);
panelDrawLD.DrawToBitmap(I_LD, new Rectangle(0,0, panelDrawLD.Size.Width, panelDrawLD.Size.Height));
I_LD.Save(tempPath + "I_LD.bmp",ImageFormat.Bmp);

图像文件已创建,但没有内容。只是空白。

我看到了一些关于这个主题的帖子,但我无法适应我的情况。

我做错了什么?什么是可能的解决方案?

你真正应该做的是将 Paint 事件重构为一个子例程,该子例程将Graphics对象作为名为target的参数。对target做你所有的画作。然后你可以调用它并从panelDrawLD_Paint传递e.Graphics,并使用你用Graphics.FromImage(I_LD)创建的Graphics从你的另一个函数调用它。

此外,如果创建Graphics(或任何其他 GDI 对象),则必须销毁它,否则将出现内存泄漏。

喜欢这个:

private void panelDrawLD_Paint(object sender, PaintEventArgs e)
{
//e.Graphics does NOT need to be disposed of because *we* did not create it, it was passed to us by the control its self.
DrawStuff(e.Graphics);
}
private void Save()
{
// I_LD, and g are both GDI objects that *we* created in code, and must be disposed of.  The "using" block will automatically call .Dispose() on the object when it goes out of scope.
using (Bitmap I_LD = new Bitmap(panelDrawLD.Size.Width, panelDrawLD.Size.Height))
{
using (Graphics g = Graphics.FromImage(I_LD))
{
DrawStuff(g);
}
I_LD.Save(tempPath + "I_LD.bmp", ImageFormat.Bmp); 
}   
}

private void DrawStuff(Graphics target)
{
//Code example
target.FillPolygon(blackBrush, getPoints(min, sizeGP, scaleX, scaleY));
target.FillPolygon(blackBrush, getPoints(max, sizeGP, scaleX, scaleY));
}

相关内容

  • 没有找到相关文章

最新更新