在WPF中可视化多层图像

时间:2015-04-24 22:47:12

标签: c# .net wpf image graphics

我的数据结构有两个字段:

* BackgroundImage (of type Bitmap/Image)
* Points (of type Point2D [])

我的用例如下:用户可以将图像加载到应用程序中。图像出现在用户屏幕上后,可能会向其添加点(通过单击鼠标按钮)。这些点应该在图像的顶部可视化,但是如果需要,用户应该重新定位它们(​​例如拖拽)。

目前,每当用户添加/移动一个点时,我都会通过执行以下操作来解决问题: *克隆BackgroundImage *绘制克隆图像上的所有点(使用System.Drawing.Graphics) *返回带有点的克隆图像(将其作为属性公开并绑定到WPF中的Image)。

这个解决方案的时间性能还可以,但它会消耗大量内存,因为每次我最终都会复制整个图像。我想知道是否有更好的方法(例如通过使用图层 - 然后我的BackgroundImage始终保持不变,而我一直只修改顶层)。

我的代码很长,但如果需要,请告诉我,我会发布。

1 个答案:

答案 0 :(得分:1)

当涉及到内存消耗时,只要你确保图像的旧实例不再生根以便GC可以删除它们,你所描述的方法没有任何问题。

但是,在克隆图像被修改的时间跨度内,当不进行克隆时,占用内存当然可能会达到最低可能值的两倍。 为了减少这种存储器消耗,可以使用UIElements实现可移动点。这也可以通过使用WPF hittesting来帮助保持实现更简单,因为" 拖动' n' drop "部分。 由于UIElements需要比BitmapImage中的点更多的内存,实际的节省取决于BitmapImage中的点与可移动点的比率。

要使用UIElements实现这些点,请将BitmapImage与Canvas一起放在Panel中。然后使用Canvas作为点的容器,并使用附加属性Canvas.TopCanvas.Left设置其位置。 要使点出现在BitmapImage的前面,请设置Canvas的Panel.ZIndex

但如果您看到不合理的内存消耗,您应该使用内存分析器仔细查看进程的哪些部分实际占用空间。