2011-05-26 97 views
4

我想將一個圖像的字節數組轉換爲BitmapImage綁定到一個按鈕。WPF BitmapImage內存使用

public static BitmapImage GetBitmapImageFromByteArray(byte[] p_Image) 
    { 
     try 
     { 
      BitmapImage bmpImage; 
      if (p_Image != null) 
      { 
       using (MemoryStream msStream = new MemoryStream(p_Image)) 
       { 
        msStream.Position = 0; 
        bmpImage = GetBitmapImageFromStream(msStream); 
        //msStream.Close(); 
        return bmpImage; 
       } 
      } 
     } 
     catch 
     { 
     } 
     return null; 
    } 

凡GetBitmapImageFromStream看起來是這樣的:

public static BitmapImage GetBitmapImageFromStream(MemoryStream msImage) 
    { 
     try 
     { 
      if (msImage == null) return null; 
       BitmapImage bmpImg = new BitmapImage(); 
       msImage.Position = 0; 
       bmpImg.BeginInit(); 
       bmpImg.CacheOption = BitmapCacheOption.OnLoad; 
       bmpImg.StreamSource = msImage; 
       bmpImg.EndInit(); 
       return bmpImg; 

     } 
     catch 
     { 
      return null; 
     } 
    } 

在bmpImg.EndInit(),還有在內存中這個巨大漲幅。我的界面上有很多按鈕,這是造成問題的原因。爲什麼會發生這種情況,我該如何修復它或如何恢復內存?

謝謝。

+1

雖然它不能解決你的問題,但在'GetBitmapImageFromStream'函數中,你創建了一個未在using語句中引用的'wrapper'流。 – Ben 2011-05-26 19:17:53

+0

對不起,這..取消它 – user296623 2011-05-26 19:49:53

回答

1

help我的猜測是,它創建一個副本來緩存它,並且也許一個副本按比例縮小以在按鈕上使用它。儘管GC未收集複製到流中的所有數據,但內存中將有多個副本。

+0

本:通過一些研究,我發現了你上面提到的,但試圖找出如何解決。 – user296623 2011-05-26 19:49:34

+0

你能解釋你的使用模式嗎?你在哪裏使用圖像,多少圖像,他們有多大?如果你使用了大量需要被查看或引用的圖片,比我認爲你無法避免大量的內存使用量,特別是當你使用大圖片時。 – Ben 2011-05-26 20:27:58

+0

每個圖像大小約爲45KB。我有30個自定義按鈕,每個按鈕顯示4個圖像。所以,它的120張圖像總共可以佔用6至7 MB內存(120 x 44K)。但我的應用程序使用大約1.2GB,並且出現內存不足異常。 – user296623 2011-05-26 20:56:40

0

嘗試限制圖片高度。您可以將DecodePixelHeight屬性設置爲BitmapImage。 轉換字節需要一些時間,但最大高度將受到限制,內存使用量將會減少。

   var bmpImg = new BitmapImage(); 
       msImage.Position = 0; 
       bmpImg.BeginInit(); 

       bmpImg.DecodePixelHeight =containerHeight; 

       bmpImg.CacheOption = BitmapCacheOption.OnLoad; 
       bmpImg.StreamSource = msImage; 
       bmpImg.EndInit(); 
       return bmpImg; 

P.也許你會在那裏發生內存泄漏。 http://code.logos.com/blog/2008/04/memory_leak_with_bitmapimage_and_memorystream.html