我理解,此消息的含义(需要对非托管资源进行Dispose),但实际上不明白为什么会出现这种情况:
System.Drawing.Image imgAnimaha, imgNoanimaha;
using (System.IO.Stream file = thisExe.GetManifestResourceStream("WindowsApplication1.img.noanimaha135.gif"))
{
using (System.Drawing.Image img = Image.FromStream(file))
{
imgNoanimaha = (System.Drawing.Image)img.Clone();
}
}
using (System.IO.Stream file = thisExe.GetManifestResourceStream("WindowsApplication1.img.animaha135.gif"))
{
using (System.Drawing.Image img = Image.FromStream(file))
{
imgAnimaha = (System.Drawing.Image)img.Clone();
}
}
pbDiscovery.Image = imgAnimaha;
在这种情况下,我得到“GDI +中发生了一般性错误”为什么以及如何解决? PS。如果我写下以下内容:
pbDiscovery.Image = imgNoanimaha;
它正常工作。 我真的不明白哪里和哪些非托管资源没有处理......
答案 0 :(得分:3)
问题在于Image.Clone(),如:
using (System.Drawing.Image img = Image.FromStream(file))
{
imgAnimaha = (System.Drawing.Image)img.Clone();
}
...不会创建图像的深层副本。它会创建所有标题信息的副本,但不会创建实际像素数据(它只指向原始像素数据)。当使用超出范围时,原始(和唯一)像素数据与原始img对象一起布置。
那么问题就变成了,这里使用的重点是什么?我建议没有。将图像读入System.Drawing.Image对象并保持活动,只要您需要像素数据(例如,只要图像需要重绘),并且只有在不需要再次显示后才处理它。