c# - 在 WPF 中高效地显示和缩放/平移大图像

标签 c# wpf zooming imaging pan

我目前正在开发一个应用程序,需要显示 8800x6800 或更大的大型工程图。要求声明用户应该能够平移和缩放图像。理想情况下,他们也希望能够对图像进行注释。如果您查看 Windows 照片查看器,您会看到我要模拟的性能和功能,但不包括注释部分。

到目前为止,我已经尝试了几种不同的方法来显示图像,但似乎没有一种方法能够提供我正在寻找的性能。它们要么占用很多内存,要么速度很慢。这些是我采取的方法:

  • ViewboxImage 作为子项。内存使用正常,但调整 Viewbox 的大小很慢。因此,我还没有尝试使用这种方法进行缩放/平移。
  • InkCanvasImage 设置为背景或子项。通过这种方法,通过 ScaleTransformTranslateTransform 进行缩放/平移看起来一般,但内存使用量可能会增加到 450-600 MB 范围内。

这是我第一次尝试使用 .NET/WPF 进行图像处理,我对这个主题的了解相当有限。处理大图像(尤其是 WPF)的一些最佳实践是什么?我读过平铺图像(如深度缩放)会有所帮助,但不确定如何执行此操作或者这是否是我所处情况的最佳主意。你知道有什么资源可以帮助我更好地理解这一点吗?

最佳答案

如果您的意思是将图像分成单独的部分并且一次只显示一小部分以提高性能,那么“平铺”就称为“虚拟化”。

Microsoft 有一篇关于虚拟化项目的精彩博客,甚至提供了 VirtualCanvas 的引用实现,您可以将其用作虚拟化控件的起点。

此处链接:https://learn.microsoft.com/en-us/archive/blogs/jgoldb/virtualized-wpf-canvas

请注意,此博客包括缩放和缩放作为讨论的一部分,以及关于平滑滚动和抢先加载图 block 以获得最佳 UI 响应的讨论。

关于c# - 在 WPF 中高效地显示和缩放/平移大图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5663763/

相关文章:

c# - 将多个参数从 c# 传递到 python

Android 禁用 WebView 触摸但保持缩放/滚动

css - MS Edge svg 缩放

android - 我可以使用 setProgress 以编程方式更改搜索栏吗

c# - 在 WebApi 运行时刷新加载的程序集

c# - ASP.NET Web 应用程序无法使用自定义 Bootstrap 正确显示内容

c# - C# 中的用户定义属性在构造时导致 StackOverflowException

c# - 如何检测用户是否更改了组合框选择

c# - 断言 ..\mono\mini\unwind.c :620, 条件 `cfa_reg != -1' 未满足

wpf - Linq 数据上下文和 "unit of work"