C#OutOfMemoryException Image.Save

时间:2015-11-15 16:57:28

标签: c# image

我想为文件夹中的每个图像创建一个高度和宽度为200px的拇指。应该进行的图像尺寸不同,没有宽度或高于1200px

List<string>ls=System.IO.Directory.GetFiles("C:\\sampleDir\\").ToList();
foreach( string  c in ls)
{  
   var fu=new Bitmap(Image.FromFile( c), new Size(200, 200));
   fu.Save("\\thumbs\\"+c);
   //delete image from memory.
   fu.Dispose();
}

经过多次迭代后,它会使fu.Save(...)崩溃@ OutOfMemoryException,例外情况为Error in GDI+

第一次出现此异常后,我添加了fu.Dispose();。 最大的问题是,为什么它不起作用。

注意通过将GC.Collect();添加到我的循环中,它可以工作,但似乎不是正确的解决方案。

对我有用的解决方案是 - 谢谢@Daniel Hilgarth:

List<string>ls=System.IO.Directory.GetFiles("C:\\sampleDir\\").ToList();
foreach( string  c in ls)
{  
   var fu1=Image.FromFile(c);
   var fu=new Bitmap(fu1, new Size(200, 200));
   fu.Save("\\thumbs\\"+c);
   //delete image from memory.
   fu.Dispose();
   fu1.Dispose();
}

2 个答案:

答案 0 :(得分:4)

您应该处理从Image返回的Image.FromFile

List<string>ls=System.IO.Directory.GetFiles("C:\\sampleDir\\").ToList();
foreach( string  c in ls)
{  
    using(var image = Image.FromFile(c))
    using(var fu=new Bitmap(image, new Size(200, 200)))
    {
        fu.Save("\\thumbs\\"+c);
    }
}

答案 1 :(得分:3)

首先,这是使用using有意义的完美示例。

List<string>ls=System.IO.Directory.GetFiles("C:\\sampleDir\\").ToList();
foreach( string  c in ls)
{ 
    using (var fu=new Bitmap(Image.FromFile( c), new Size(200, 200)))
    {
        fu.Save("\\thumbs\\"+c);
    }
}

即使内部代码抛出异常,using语句也会为您调用Dispose

但看起来你还有一个Image对象,你没有自由。要释放该对象,可以更新上面的代码,如下所示。

List<string>ls=System.IO.Directory.GetFiles("C:\\sampleDir\\").ToList();
foreach( string  c in ls)
{ 
    using (var img = Image.FromFile(c))
    using (var fu=new Bitmap(img, new Size(200, 200)))
    {
        fu.Save("\\thumbs\\"+c);
    }
}