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();
}
您也应该处理从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);
}
}