2015-11-15 50 views
0

我想爲文件夾中的每個圖像創建一個200px高度和寬度的拇指。這應該被起訴的圖像大小各不相同,沒有寬或高於1200像素C#OutOfMemoryException Image.Save

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

拇指良好的規則 - 如果你使用任何實現'IDisposible',包起來的'使用{} '。 – jdphenix

+0

值得注意的是.Net綁定到GDI +是放棄分析根本原因而臭名昭着的,而是聲稱「我已經消除了一半錯誤的可能原因,其他所有我會報告爲內存不足的東西」。如果給出的答案沒有幫助,則需要深入挖掘並在.Net放棄之前找到實際的原始錯誤代碼。 –

回答

4

你應該配置是從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); 
    } 
} 
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); 
    } 
} 
+0

「你是否說它在你添加fu.Dispose()?的時候工作正常?」 - 不,這不是他所說的。他說,即使這樣,它*不會工作。 –

+0

您可能還需要幫助Bitmaps使用文件序列化本身,並在文件序列化中使用位圖實例通過調用close或使用您明確創建的文件流進行處理。 - 如果位圖上的Dispose似乎沒有完全解決這個問題。 –

+0

@DanielHilgarth:嗯,我不認爲他這麼說,但我已經更新了我的答案。 –