C# WPF中多层图像的可视化

C# WPF中多层图像的可视化,c#,.net,wpf,image,graphics,C#,.net,Wpf,Image,Graphics,我的数据结构有两个字段: * BackgroundImage (of type Bitmap/Image) * Points (of type Point2D []) 我的用例如下:用户可以将图像加载到应用程序中。当图像出现在用户的屏幕上后,他们可能会向其添加点(通过单击鼠标按钮)。这些点应该显示在图像的顶部,但是如果需要,用户应该能够重新定位它们(例如拖放) 目前,每当用户添加/移动点时,我都会执行以下操作来解决问题: *克隆背景图像 *在克隆图像上绘制所有点(使用System.Drawin

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

* BackgroundImage (of type Bitmap/Image)
* Points (of type Point2D [])
我的用例如下:用户可以将图像加载到应用程序中。当图像出现在用户的屏幕上后,他们可能会向其添加点(通过单击鼠标按钮)。这些点应该显示在图像的顶部,但是如果需要,用户应该能够重新定位它们(例如拖放)

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

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


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

当涉及内存消耗时,您描述的方法没有问题,只要您确保映像的旧实例不再是根,以便GC可以删除它们

但是,在修改克隆映像的时间跨度期间,内存占用当然可能会达到不克隆时最低可能值的两倍。 为了减少内存消耗,可以使用UIElements实现可移动点。通过对“拖放”部分使用WPF hittesting,这也有助于简化实现。 由于UIElements需要比BitmapImage中的点更多的内存,因此实际节省的内存取决于BitmapImage中的点与可移动点的比率

要使用UIElements实现点,请将BitmapImage与画布一起放置在面板中。然后将画布用作点的容器,并使用附加的属性
Canvas.Top
Canvas.Left
设置它们的位置。 要使点显示在位图图像前面,请设置画布的
面板.ZIndex


但是,如果您发现内存消耗不合理,则应使用内存探查器仔细查看流程的哪些部分实际占用了空间。

根据实际情况(点数、图像大小),最好将点放置在面板(画布)中显示在图像顶部。点数:~30。图像大小:取决于用户的资源(基本上应该能够加载硬盘上的任何内容)。我会很快给你的提示一个镜头。好的-我使用了画布+项目控件,如下所示:。。。。但是,在调整窗口大小时出现了一个问题——图像缩放效果很好,这对于画布来说是不正确的。有没有办法使它们保持同步(即将画布位置/比例/大小绑定到图像)?要均匀缩放多个元素,可以将它们全部放在网格中,并将此网格放在视口框中。然后,Viewbox将处理缩放。我只是快速尝试了一下(错过了时间,对不起),到目前为止,它看起来很有希望。我打算很快更仔细地研究解决办法。在此之前-能够缩放图像的选定部分(当然有点)也很好。我已经使用ScaleTransform测试了一个手动实现,效果很好,但是给我带来了很多负担。有没有更好的办法?