C#内存不足异常映像.保存

本文关键字:保存 映像 异常 内存不足 | 更新日期: 2023-09-27 18:22:03

我想为文件夹中的每个图像创建一个高度和宽度为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();
}

经过几次迭代后,它会用OutOfMemoryException崩溃@fu.Save(...),异常为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();
}

C#内存不足异常映像.保存

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

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);
    }
}

首先,这是一个使用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);
    }
}