2014-02-14 20 views
0

我有一個C#程序,它從目錄中的圖像創建位圖列表。它將使用整個Bitmaps列表生成一張新圖像,然後保存。當用戶加載一個新目錄重複該過程時,位圖列表被清除並重新填充。在創建對象「新位圖(路徑)」時加載位圖。正確處理沒有垃圾收集的未引用圖像C#

我有當用戶執行以下步驟發生一個問題:從目錄

  1. 加載圖像1
  2. 選擇不保存,而是從目錄加載圖像2次
  3. 試圖通過保存覆蓋目錄中的圖像1
  4. 由於「GDI +中的一般錯誤」,程序無法保存,因爲它仍在「使用」正在被覆蓋的圖像。

從目錄1加載位圖的原始列表確實被清除,然後從目錄2.然而,隨着圖像填充,Bitmap.Save()拒絕覆蓋它以前加載除非我呼叫系統的圖像。我執行Clear()後,GC.Collect()。

我很確定這個問題與保留位圖有關,即使沒有引用,否則爲什麼垃圾收集能解決問題?這是解決這個問題的正確方法,還是有一種「適當」的方式來處理C#中的位圖?謝謝。

+0

你通過'Bitmap.FromStream'加載它們?你目前如何「處置」他們?通過調用'.Dispose()'? –

+0

哦,對不起,我不是;我正在使用新的位圖(路徑)。讓我更新這個問題。 – limitlessinfinity

+0

我沒有調用.Dispose();出於某種原因,沒有想到。哦,jeez,對於這個愚蠢的問題感到抱歉。我想我會自己回答,除非你想這樣做。 – limitlessinfinity

回答

1

你需要在Bitmap實例上調用Dispose ..所以他們釋放他們的文件句柄。

var bitmap = new Bitmap(path_to_file); 
// use it 
bitmap.Dispose(); 

或者,由於從Image它實現IDisposableBitmap繼承,你可以這樣做:

using (var bitmap = new Bitmap(path_to_file)) { 
    // use it.. 
} 
+0

謝謝,我不能相信我忘了那件事。我甚至在標題中使用了「處置」一詞。 – limitlessinfinity