将WPF DrawingGroup渲染为单个ImageSource

3

目前我正在使用System.Windows.Media.DrawingGroup来存储一些平铺图像(ImageDrawing),并将它们放在Children-DrawingCollection属性中。

问题是,如果您在Image控件中显示整个DrawingGroup,这种方法会变得非常缓慢,因为我的DrawingGroup可能包含数百甚至数千个小图像,这可能会严重影响性能。

所以我的第一个想法是从DrawingGroup中的所有小图像渲染出单个图像,然后仅显示该图像,这样会快得多。但正如您可能已经发现的那样,我还没有找到任何解决方案可以使用WPF Imaging简单地组合多个图像。

如果有人能帮助解决这个问题或告诉我如何改进DrawingGroup的性能,甚至使用另一种方法,那将真的很好。

最后一件事,目前我正在使用RenderTargetBitmap从DrawingGroup生成单个BitmapSource,这种方法并不快,但至少可以使滚动和Image控件上的工作更加流畅。

2个回答

2
我不确定这是否适用于您的问题,但我会在此发布它,因为它可能会帮助某些人:
如果绘图组中并非所有图像都将同时可见,则可以将ClipGeometry属性设置为您想要绘制的内容。这有效地告诉WPF,在呈现过程中,几何形状之外的部分是不需要的,将被跳过。
您还可以尝试一些其他的事情:
  • 在将绘图组应用于图像源之前冻结它。至少不会有害(除非您真的需要修改实例,但请记住,您始终可以创建一个新实例而不是修改旧实例)
  • 尝试不同的方式来显示您的绘图组。例如作为DrawingVisual(被认为是轻量级)或作为DrawingBrush来绘制一个矩形。
  • 将小图像合并成较小的组,然后将它们组合成更大的组。不知道这是否会提高或降低性能,但值得一试。

1

我正在解决一个与平铺图像有关的问题,还要在一些图像上叠加显示其他图像,增加了一些复杂性。

我还没有遇到任何性能问题(也不太可能遇到,因为我的图像相当小且数量相对较少,最多只有100个),但是我在DrawingImage类的代码示例中发现了Freeze方法。它的注释是“为了获得性能优势,请冻结DrawingImage。”

Freeze方法也适用于DrawingGroup类。也许可以试试?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接