2017-06-13 7 views
-1

私は、連続するウェブカメラフレームを(ビデオエンコードではなく)個々の画像として保存する科学的画像キャプチャアプリケーションを開発しています。BitmapDecoderの使用がSystemOutOfMemoryExceptionを引き起こさないようにする

ファイルはzipアーカイブに保存され、キャプチャを分析のためにロードされるとき、所定の位置のフレームが照会されるたびに、BitmapFrameは次のクラス方法LoadImage()によって生成される:

public class ImagemCinemetria 
{ 
    public int Index { get; private set; } 

    public byte[] ImageBytes { get; private set; } 

    public BitmapSource Imagem 
    { 
     get 
     { 
      if (_imagem == null) 
       _imagem = LoadImage(); 
      return _imagem; 
     } 
    } 
    BitmapSource _imagem; 


    // CONSTRUTOR 
    public ImagemCinemetria(int index, byte[] jpegBytes) 
    { 
     Index = index; 
     ImageBytes = jpegBytes; 
    } 



    private BitmapSource LoadImage() 
    { 
     using (var stream = new MemoryStream(ImageBytes)) 
     { 
      var decoder = new JpegBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad); 
      return decoder.Frames.First(); 
     } 
    } 
} 

問題は、(ビデオプレーヤーに類似したスライダカーソルを動かすことによって)キャプチャをナビゲートしてから、BitmapFramesがロードされ始めると、巨大なメモリ消費があり、まもなく私はSystemOutOfMemoryExceptionになります。

私は曖昧にしてWPFビットマップ用のキャッシュオプションがいくつかあると知っていますが、何をすべきかわかりません。

答えて

0

私は自分で解決策を見つけることになりました。

どのようなJpegBitmapDecoderはそんなにメモリを占有している理由は、実際の問題は、すべてのクラスの寿命のためにメモリの中で参照プロパティImagem滞在ということです。

私はそれが呼び出されるBitmapFrame、デノボたびに作成されますプロパティのゲッターによって遅延ロードを置き換えることにより、OutOfMemoryExceptionを処分した:私は今

ので、代わりの

public BitmapSource Imagem 
{ 
    get 
    { 
     if (_imagem == null) 
      _imagem = LoadImage(); 
     return _imagem; 
    } 
} 
BitmapSource _imagem; 

をhave

public BitmapSource Imagem => LoadImage(); 
関連する問題