私は、連続するウェブカメラフレームを(ビデオエンコードではなく)個々の画像として保存する科学的画像キャプチャアプリケーションを開発しています。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ビットマップ用のキャッシュオプションがいくつかあると知っていますが、何をすべきかわかりません。