1

FrameworkElementを非常に大きなラスターイメージとして保存する必要があります。今のところ、次のようにRenderTargetBitmapクラスとBitmapEncoderを使用しています。

RenderTargetBitmap bmp = new RenderTargetBitmap(ElementWidth, ElementHeight, 
     90, 96, PixelFormats.Default);

bmp.Render(MyElement);  // OutOfMemoryException here

PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bmp));

using (var stream = File.Create(filePath))
{ encoder.Save(stream); }

ここで、ElementWidthとElementHeightは大きな数値(約10000x6000)です。しかし、このソリューションでは、要素をレンダリングしようとするとOutOfMemoryExceptionが発生します。

(OutOfMemoryExceptionを引き起こさずに)必要なことを行う他の方法はありますか?ありがとう。

4

1 に答える 1

1

この場合、FrameworkElementをタイルでレンダリングする必要があります。これを行う最も簡単な方法は、Clipプロパティをレンダリングするタイルの位置/サイズに設定し、タイルサイズのRenderTargetBitmapのインスタンスを使用してその部分をディスクに取得することです。今、あなたはどちらかをすることができます

  1. ピースをそのままにして、ある種のディープズームタイプのタイルレンダラーで使用します
  2. ImageMagickのコマンドライン/大きな画像のサポートを使用してそれらすべてを結合するか(最初にレンダリングするためにメモリに収まらない場合は、すべてをロードして結合することもできないことに注意してください)、またはファイルを解析して自分で行いますフォーマットしてから正しい出力ファイルを書き込みます。

もちろん、オプション2が役立つかどうかはわかりません。なぜなら、巨大な出力ファイルを書き込んだとしても、誰かがそれをどのようにロードするのでしょうか。:)

お役に立てれば!

于 2012-05-14T15:41:58.757 に答える