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 回答