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