2014-11-21 33 views
1

因此,我目前正在研究一個圖像調整器工作/工作相當好,但除了它給我一個OutOfMemoryException當我一次處理太多的圖像崩潰程序。Bitmap ArgumentException返回使用語句後

因此,爲了解決這個問題,我已經將方法封裝在using語句中,以便Bitmaps可以正確處理。

但是我注意到,如果我回到using語句在我的位圖我得到這個「ArgumentException的是未處理」的消息

這裏我ImageResize方法:

public Bitmap ResizeImage(MemoryStream ms, Size size) 
    { 
     if (comboBox2.Text == "Pixel") 
     { 
      using (Bitmap img = new Bitmap(new Bitmap(ms, true), size.Width, size.Height)) 
      { 
       var original = new Bitmap(ms, true); 
       Graphics graphic = Graphics.FromImage(img); 

       //IRRELEVANT CODE..... 

       return img; 
      } 
     } 
     else 
     { 
      return null; 
     } 

在這裏,當我嘗試保存

private void button1_Click(object sender, EventArgs e) 
    { 
    //IRRELEVANT CODE ... 
    img = ResizeImage(memory, new Size(getX(), getY())); 
    //IRRELEVANT CODE ... 
    img.Save(outputFileName, codec, encoderParams); //<-Exception occurs here 
    } 

當我刪除using語句再次一切工作完全正常,但我必須使用日:我的ImageResize方法外樹形象e使用塊來處理Bitmap併爲此防止內存泄漏。 另外,當我將圖像保存在using語句中時,它也可以正常工作,但對我來說這不是一個解決方案。

我在做什麼錯?對我來說,似乎位圖不能正確返回。

我感謝所有幫助和感謝提前 Ravand

+0

我喜歡評論'/ IRRELEVANT CODE ...'。它屬於[此線程](http://stackoverflow.com/q/184618/2596334)。 – 2014-11-21 13:12:24

+0

哈哈哈貼吧,如果你喜歡:D,但老實說在這種情況下它是無關緊要的 – Ravand 2014-11-21 13:14:42

回答

0

好吧,我終於固定的內存泄漏問題,原來,我確實發佈/配置的圖像,但它沒有這樣做不夠快當你正在處理很多非常大的圖像時,這會導致OutOfMemoryException異常。我試着讓所有的東西都是多線程的,並且一直等待WorkingSet變得更小而沒有成功。

原來它比我更容易thhought,我不得不做的就是把這個在我調整大小的方法的末尾:

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
System.Threading.Thread.SpinWait(5000); 

,這似乎做魔術與10調整大圖尺寸爲20mb,分辨率爲10000x10000。有人可以解釋爲什麼SpinWait有幫助,但不是正常的線程睡眠?每當我嘗試睡覺線程時,它似乎也睡覺了內存的釋放。

5

你你在錯誤的地方使用放。在使用塊(包括從其返回)結束之後,處理由塊控制的對象。訪問已處理的位圖是一個錯誤。

你的使用需求,而不是在這裏:

private void button1_Click(object sender, EventArgs e) 
{ 
    //IRRELEVANT CODE ... 
    using(img = ResizeImage(memory, new Size(getX(), getY()))) 
    { 
     //IRRELEVANT CODE ... 
     img.Save(outputFileName, codec, encoderParams); 
    } 
} 
+0

提供有關不太相關代碼的更多細節,或者只是限制你一次處理多少圖片。 – 2014-11-21 13:22:54

+0

哦,我是sry,我錯過了,我沒有得到MemoryException,但我得到了我現在在ResizeImage方法中的按鈕點擊事件中收到的ArgumentException ...如此友善我回到我開始的地方 – Ravand 2014-11-21 13:38:50

+0

1.你在'ResizeImage'中刪除了'using'? 2.有什麼論點? – 2014-11-21 13:50:35