GDI +再次发生一般错误

时间:2013-03-21 13:48:48

标签: c# gdi+ system.drawing

我理解,此消息的含义(需要对非托管资源进行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;

它正常工作。 我真的不明白哪里和哪些非托管资源没有处理......

1 个答案:

答案 0 :(得分:3)

问题在于Image.Clone(),如:

using (System.Drawing.Image img = Image.FromStream(file))
{
  imgAnimaha = (System.Drawing.Image)img.Clone();
}

...不会创建图像的深层副本。它会创建所有标题信息的副本,但不会创建实际像素数据(它只指向原始像素数据)。当使用超出范围时,原始(和唯一)像素数据与原始img对象一起布置。

那么问题就变成了,这里使用的重点是什么?我建议没有。将图像读入System.Drawing.Image对象并保持活动,只要您需要像素数据(例如,只要图像需要重绘),并且只有在不需要再次显示后才处理它。