我有一个由Panel创建的全局Graphics对象。定期从磁盘上获取一张图像,并使用Graphics.DrawImage()方法将其绘制到面板中。它在几次迭代中正常工作,然后出现以下有用的异常:
System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+.
at System.Drawing.Graphics.CheckErrorStatus(Int32 status)
at System.Drawing.Graphics.DrawImage(Image image, Int32 x, Int32 y)
at System.Drawing.Graphics.DrawImage(Image image, Point point)
我排除了内存泄漏的可能性,因为在完成操作后我会释放图像对象。我知道图片没有损坏,并且在程序运行一段时间后面板停止显示之前,程序可以正常执行。
当我使用PictureBox时,我遇到了相同的问题,但这次至少我得到了一个错误,而不是什么也没有。
我在任务管理器中检查了GDI对象和USER对象,但当应用程序正常工作或不正常工作时,它们的数量始终保持在约65个用户对象和165个GDI对象左右。
我需要尽快找到问题的根本原因,但并不像我可以在.NET系统库中设置断点并查看执行失败的确切位置。
提前致谢。
编辑:这是显示代码:
private void DrawImage(Image image)
{
Point leftCorner = new Point((this.Bounds.Width / 2) - (image.Width / 2), (this.Bounds.Height / 2) - (image.Height / 2));
_graphics.DrawImage(image, leftCorner);
}
图片加载代码:
private void LoadImage(string filename, ref Image image)
{
MemoryStream memoryStream = DecryptImageBinary(Settings.Default.ImagePath + filename, _cryptPassword);
image = Image.FromStream(memoryStream);
memoryStream.Close();
memoryStream.Dispose();
memoryStream = null;
}
_image是全局变量,它的引用在LoadImage中被更新。这些参数是作为参数传递的,因为我想尽可能少地改变全局引用,只保留其他方法的自包含性。_graphics也是全局的。
我还有一个WebBrowser控件用于显示网站,一次只能显示一张图像或网站。当有时间显示图像时,以下代码会执行:
webBrowser.Visible = false;
panel.Visible = true;
DrawImage(_image)
_image.Dispose();
_image = null;
_image引用一个预加载的图片。
希望这能帮到你。