2

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()
4

3 に答える 3

0

問題が解決してうれしいです。しかし、それが正しい修正であるとは確信していません。パラメーターを 1 つだけ指定して BitmapFrame.Create() を呼び出しているようです。あなたはそれをもっと注意深く見たいと思うかもしれません..

BitmapCacheOption.None フラグを使用してみてください。デフォルトでは、理由もなくメモリ内の各ビットマップをキャッシュしている可能性があります。

BitmapFrame.Create(ソース、BitmapCreateOptions.PreservePixelFormat、BitmapCacheOption.None);

于 2014-09-23T21:33:29.673 に答える