2009-10-08 57 views
7

我前一段時間發佈相關的WriteableBitmap的內存泄漏問題,雖然我接到相關問題的精彩提示,我仍然認爲這是一個嚴重的錯誤/(錯誤我做的)/(混亂)/ (一些其他的東西)在這裏。如何處理可寫位圖? (WPF)

所以,這裏又是我的問題:

假設我們有一個形象和一個按鈕WPF應用程序。圖像的來源是一個非常大的位圖(3600 * 4800像素),當它在運行時的顯示的一個應用消耗〜90 MB。

現在假設我希望從圖像(真正的大圖像),源實例化一個WriteableBitmap的,當這種情況發生的應用程序消耗〜220 MB。

現在出現了棘手的部分,當對圖像的修改(通過WriteableBitmap)結束時,以及對WriteableBitmap的所有引用(至少我知道的那些)都被銷燬(在方法結束時或將其設定爲null)由WriteableBitmap的使用的存儲器應該釋放和應用程序消費應返回到〜90 MB。問題是有時會返回,有時不會。

這裏是一個示例代碼:

// The Image's source whas set previous to this event 
private void buttonTest_Click(object sender, RoutedEventArgs e) 
    { 
     if (image.Source != null) 
     { 
      WriteableBitmap bitmap = new WriteableBitmap((BitmapSource)image.Source); 

      bitmap.Lock(); 

      bitmap.Unlock(); 

      //image.Source = null; 
      bitmap = null; 
     } 
    } 

正如你所看到的引用是本地和內存應該在方法結束(或當垃圾回收器決定這樣做)被釋放。但是,應用程序可能消耗〜224 MB直到宇宙結束。

任何幫助將是偉大的。

回答

0

是否有必要渲染位圖圖像在相同的分辨率和像素?您可以在低得多的像素集處創建writeablebitmap並調用渲染方法。由於WriteableBitmap的呼叫時給予,在這種情況下進行到原來的UI元素的引用,你將有3個組塊:1)原始的UIElement,2)在WriteableBitmap的像素,3)參照複製原件。

我曾與WriteableBitmap的一個類似的問題在內存泄漏方面,我固定它檢查出此鏈接: http://www.wintellect.com/CS/blogs/jprosise/archive/2009/12/17/silverlight-s-big-image-problem-and-what-you-can-do-about-it.aspx

如果你創建另一個WriteableBitmap的又一遍地抄寫像素,然後清除第一WriteableBitmap的的你應該看到一些內存釋放 - 至少我在我的場景中做過。