TiffBitmapEncoder を使用して TIFF 画像に変換することで、数百の BitmapSources を保存している WPF アプリケーションがあります。ただし、この奇妙なメモリ消費があり、メモリ不足の例外がスローされることがよくあります。
ノート:
- 8GBのRAMがインストールされています。
- 画像サイズは 10x10 から 300x300 ピクセル (非常に小さい) までさまざまです。
動作するコードは次のとおりです。
static void SaveBitmapSource(BitmapSource bitmapSource)
{
TiffBitmapEncoder encoder = new TiffBitmapEncoder();
encoder.Compression = TiffCompressOption.Zip;
BitmapFrame frame = BitmapFrame.Create(bitmapSource);
encoder.Frames.Add(frame);
using (MemoryStream ms = new MemoryStream())
{
encoder.Save(ms);
}
}
そして、これが私の記憶のスクリーンショットです。
ここで、BitmapSource を (1 回でも) 複製すると、この巨大なメモリ割り当てが発生し、メモリ不足の例外が発生します。
static BitmapSource source2 = null;
static void SaveBitmapSource(BitmapSource bitmapSource)
{
if (source2 == null)
{
source2 = bitmapSource.Clone();
}
TiffBitmapEncoder encoder = new TiffBitmapEncoder();
encoder.Compression = TiffCompressOption.Zip;
BitmapFrame frame = BitmapFrame.Create(source2);
encoder.Frames.Add(frame);
using (MemoryStream ms = new MemoryStream())
{
encoder.Save(ms);
}
}
これは、2 番目のコード サンプルの私の記憶のスクリーンショットです。
これを引き起こしている可能性のあるものと、それを修正する方法を知っている人はいますか?
違いは、最初の例の BitmapSource が画面にレンダリングされ、2 番目の例ではレンダリングされていないことです。私の疑いでは、これは GPU と Dispatcher に関係している可能性があります。これは変換を加速するハードウェアである可能性がありますが、2 つ目は何らかのバグがある CPU で行われます...
試した:
- 運がなかっ
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true);
た後に電話をかけてみましたSaveBitmapSource()