我的数据结构有两个字段:
* BackgroundImage (of type Bitmap/Image)
* Points (of type Point2D [])
我的用例如下:用户可以将图像加载到应用程序中。图像出现在用户屏幕上后,可能会向其添加点(通过单击鼠标按钮)。这些点应该在图像的顶部可视化,但是如果需要,用户应该重新定位它们(例如拖拽)。
目前,每当用户添加/移动一个点时,我都会通过执行以下操作来解决问题: *克隆BackgroundImage *绘制克隆图像上的所有点(使用System.Drawing.Graphics) *返回带有点的克隆图像(将其作为属性公开并绑定到WPF中的Image)。
这个解决方案的时间性能还可以,但它会消耗大量内存,因为每次我最终都会复制整个图像。我想知道是否有更好的方法(例如通过使用图层 - 然后我的BackgroundImage始终保持不变,而我一直只修改顶层)。
我的代码很长,但如果需要,请告诉我,我会发布。
答案 0 :(得分:1)
当涉及到内存消耗时,只要你确保图像的旧实例不再生根以便GC可以删除它们,你所描述的方法没有任何问题。
但是,在克隆图像被修改的时间跨度内,当不进行克隆时,占用内存当然可能会达到最低可能值的两倍。 为了减少这种存储器消耗,可以使用UIElements实现可移动点。这也可以通过使用WPF hittesting来帮助保持实现更简单,因为" 拖动' n' drop "部分。 由于UIElements需要比BitmapImage中的点更多的内存,实际的节省取决于BitmapImage中的点与可移动点的比率。
要使用UIElements实现这些点,请将BitmapImage与Canvas一起放在Panel中。然后使用Canvas作为点的容器,并使用附加属性Canvas.Top
和Canvas.Left
设置其位置。
要使点出现在BitmapImage的前面,请设置Canvas的Panel.ZIndex
。
但如果您看到不合理的内存消耗,您应该使用内存分析器仔细查看进程的哪些部分实际占用空间。