2012-05-14 26 views
1

我必须将我的FrameworkElement保存为非常大的光栅图像。现在我用的是RenderTargetBitmap类和BitmapEncoder,以这样的方式如何将FrameworkElement保存为非常大的栅格图像?

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)。但有了这个解决方案,当我尝试Render我的元素时出现OutOfMemoryException。

还有其他方法可以做我所需要的(不会导致OutOfMemoryException)? 谢谢。

回答

1

在这种情况下,您将不得不在Tile中呈现FrameworkElement。最简单的方法是将Clip属性设置为要渲染的拼贴的位置/大小,然后使用拼贴大小的RenderTargetBitmap的实例在磁盘上获取该拼块。现在,您可以

  1. 离开件按原样在某种deep-zoom type tiled renderer
  2. 使用它们结合所有这些(注意,如果他们没有装入内存在首位渲染,你可以'加载'em全部结合,或者)使用ImageMagick's command line/large image support或者通过解析文件格式然后编写正确的输出文件来完成。

当然,我不知道选项2是否有任何帮助,因为即使您编写了巨大的输出文件 - 如何加载它? :)

希望这有助于!