将WPF DrawingGroup渲染为单个ImageSource

时间:2009-08-28 12:21:00

标签: c# .net wpf image drawing

目前我正在使用System.Windows.Media.DrawingGroup在Children-DrawingCollection属性中存储一些平铺图像(ImageDrawing)。 问题是现在,如果你在Image控件中显示整个DrawingGroup,这个方法会变得非常慢,因为我的DrawingGroup可以包含数百甚至数千个小图像,它实际上可能会破坏性能。

所以我的第一个想法是以某种方式从DrawingGroup中的所有小图像渲染单个图像,然后只显示该图像,这将更快。但是你可能已经发现我没有找到任何解决方案,所以只需将几个图像与WPF Imaging结合起来。

如果有人可以帮助解决这个问题,或者告诉我如何使用DrawingGroup提高性能甚至使用其他方法,那真的很棒。

最后一件事,目前我正在使用RenderTargetBitmap从DrawingGroup生成一个BitmapSource,这种方法并不是真的更快,但它使得在Image控件上滚动和处理至少更加平滑。

2 个答案:

答案 0 :(得分:2)

我不确定这是否适用于您的问题,但无论如何我都会在此发布,因为它可能有助于某人:

如果并非所有图形组中的图像同时可见,您可以将ClipGeometry属性设置为您想要绘制的任何属性。这有效地告诉WPF几何外部的部分不需要,并且在渲染过程中将被跳过。

您可以尝试的其他一些事项是:

  • Freeze绘图组在将其应用于您的图像源之前。至少它不会受到伤害(除非你真的需要修改实例,但记住你总是可以创建一个新实例而不是修改它)
  • 尝试使用不同的方式显示绘图组。例如,DrawingVisual(被认为是轻量级)或DrawingBrush来绘制,例如一个矩形。
  • 将小图像组合成较小的组,然后组合成较大的组。不知道这是否会改善或伤害性能,但值得尝试。

答案 1 :(得分:1)

我正在处理与平铺图像有关的问题,而且还需要显示一些覆盖在其他图像上的图像。

我没有遇到任何性能问题(可能不会因为我的图像相当小且数量相对较少,大约100个最大值),但我确实遇到了代码示例中的Freeze方法DrawingImage类。它的评论是“冻结DrawingImage以获得性能优势。”

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