2013-03-21 79 views
1

我明白了,这是什么消息的装置(需要做的处置非托管资源),但真的不明白为什么它在我的情况发生:一般性错误+再次

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

您是否尝试过使用不同的位图? – 2013-03-21 16:22:44

回答

3

的问题是,Image.Clone(),如:

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

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

那么问题就变成了,这里的用法是什么?我会建议没有。将图像读入System.Drawing.Image对象,只要需要像素数据(例如只要需要重新绘制图像)就保持活动状态,并且只有在不需要再次显示时才将其丢弃。

+0

问题是,图像加载代码似乎锁定原始文件。从克隆底层文件或流关闭的某个时刻开始,您会看到该错误。 – Nyerguds 2014-08-21 10:56:09