2012-02-07 31 views
3

我知道非常類似的問題在這裏問過去 - 但也有我的問題的解決方案:還是內存泄漏.NET4 - 結合內存的BitmapImage成圖像源

我從內存中加載一個圖像到一個的BitmapImage:

private static BitmapImage LoadImage(byte[] imageData) 
    { 
     if (imageData == null || imageData.Length == 0) return null; 
     var image = new BitmapImage(); 
     using (var mem = new MemoryStream(imageData)) 
     { 
      mem.Position = 0; 
      image.BeginInit(); 
      image.CreateOptions = BitmapCreateOptions.PreservePixelFormat; 
      image.CacheOption = BitmapCacheOption.OnLoad; 
      image.UriSource = null; 
      image.StreamSource = mem; 
      image.EndInit(); 
     } 
     image.Freeze(); 
     return image; 
    } 

然後使用這樣(INotifyPropertyChange)到所得的BitmapImage綁定到圖像對象的源(在頁面上)。

問題是:這將導致內存泄漏

你甚至不覺得這用廓線 - 只有.NET內存分析器讓我上(很多在我的情況達2-3圖像300MB!)軌道(因爲它是在非託管內存中的所有字節去 - 所以螞蟻告訴我「.NET使用分配給應用367,3MB的19,24MB總專用字節」 - 漂亮的): Memory-Profiler output

enter image description here

無論我嘗試什麼 - 我都沒有得到這個泄漏。 嘗試(單,一次全部):

  • 清晰的視覺樹/刪除上卸載圖像
  • 設置圖像-來源爲空
  • 使用圖像刷的矩形,而不是圖像
  • 其他CacheOptions而不設置的MemoryStream
  • 不凍結圖像

我不明白這一點 - 是真的! 只要我停止使用源中的圖像,一切都可以(沒有泄漏)。

有人可以嘗試嗎?

REMARK 看起來這是完全沒有錯誤(見我的第二個評論) - 我要檢查這個,所以我會讓這個問題打開了 - 這也許可以用這個其他的問題有所幫助

+0

嗯......不知道這是不是真的* *由於「泄漏」的內存泄漏似乎約爲550MB,此後一些(200-300MB)內存被釋放,如果我再次加載位圖 - 但仍然不是所需的行爲...... – Carsten 2012-02-07 12:32:15

+1

好吧......哦,我的 - 似乎這個問題是由愚蠢的圖片使用造成的。這些圖片是由用戶提供的(某種地圖 - 黑/白,有很多白色),我只查看了文件大小(大約1MB) - 但是這些是.JPG,圖片的分辨率高達10,000 X 5,000像素(sic!) - 將其解壓縮爲32位,每張圖片輕鬆達到> 150MB ...所以我想我可以稱這個解決方案爲「解決方案」,但現在我會打開它 - 也許有一些好的評論,我仍然必須嘗試「解決方法」(=合理的圖片) – Carsten 2012-02-07 12:54:11

回答

0

對不起 - 這確實不是「錯誤」,而是由高分辨率圖片造成的。

在此請評論,如果我要刪除的問題,或者如果我要離開這裏的其他人可能接觸到同樣的情況......

+0

只需選擇此作爲正確的答案。 – Will 2012-02-10 16:42:13