2011-05-26 29 views
4

イメージのバイト配列をBitmapImageに変換してボタンにバインドしようとしています。 GetBitmapImageFromStreamはこのようなものになります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; 
    } 

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

+0

それについて残念です。それを取り除いた – user296623

答えて

1

投稿者:help私の推測では、それをキャッシュするためのコピーが作成され、かもしれません。 1つのコピーがボタンで使用するために縮小されています。 GCはストリームにコピーされたすべてのデータを収集しませんが、メモリには複数のコピーが存在します。

+0

ベン:いくつかの調査で、私はあなたが上で述べたことを見つけましたが、解決する方法を見つけようとしました。 – user296623

+0

あなたの使用パターンを説明できますか?画像を使用する場所、画像のサイズ、サイズはどれくらいですか?いつも見たり参照したりする必要のあるたくさんの画像を使用すると、特に大きな画像を使用すると大きなメモリの使用を避けることはできないと思います。 – Ben

+0

各画像サイズは約45KBです。私は4つの画像をそれぞれ表示する30個のカスタムボタンを持っています。そのため、合計120枚の画像が6〜7MBのメモリ(120×44K)まで占有することができます。しかし、私のアプリケーションは約1.2GBを使用しており、メモリ不足例外が発生します。 – user296623

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.s.たぶんあなたはメモリリークを起こすでしょう。 http://code.logos.com/blog/2008/04/memory_leak_with_bitmapimage_and_memorystream.html