【发布时间】:2016-02-21 01:49:42
【问题描述】:
我有一个应用程序,我在其中使用Image 控件来显示大图像(~8000x8000 像素)。我将图像控件绑定到 ImageSource,如下所示:
<Image x:Name="_ImageSource" Source="{Binding ViewModel.Image, Mode=OneWay}" RenderOptions.BitmapScalingMode="Linear"/>
我正在使用 Leadtools 图像库来创建 ImageSource,它是一个 WritableBitmap。
this.Image = RasterImageConverter.ConvertToSource(displayImage, ConvertToSourceOptions.None) as BitmapSource;
一切正常,但是在视图模型上设置 Image 属性的时间与 Image 控件实际更新显示的时间之间存在显着延迟(对于大图像,大约需要 10 秒)。我做了一些分析/记录,我知道这不是对RasterImageConverter.ConvertToSource() 的调用,而是图像控件本身正在做的事情。
到目前为止,我一直无法找出导致这种延迟的原因。至少我希望能够在控件实际更新时得到通知,这样我就可以显示某种忙碌的通知,但似乎没有任何事件在正确的时间触发。
感谢任何想法或帮助。
【问题讨论】:
-
这更像是解决问题的最后努力建议,因此如果存在更直接的解决方案,它肯定会更好(至少从生产力的角度来看)。但是,对于任何需要图像像素直接顺序访问之外的任何图像处理功能,具有 8000 像素宽扫描线的 6400 万像素图像将成为非常瓶颈。例如,如果您将其分解为多个平铺图像(例如:10x10 图像平铺,每个平铺图像为 800x800 像素),您可能会看到相当大的提升。如果您没有找到非常直接的内容,可以尝试...
-
...答案可以调整传递给 API 的一些参数或类似的东西,并在处理图像的函数中恢复更好的空间局部性。
-
要尝试的另一件事——
NearestNeighbor插值BitmapScalingMode而不是Linear。这是一个非常悲观的建议,因为除非您确实以最轻微的方式缩放图像,否则无论您选择哪种模式都不会产生任何成本。但是,无论出于何种原因,存在一些亚像素采样的可能性很小,最近邻居将避免垂直像素邻居的访问(这对于 8k 像素宽的图像来说确实很昂贵)。 -
NearestNeighbor似乎没有帮助。我在想这可能只是太多的数据,并且在设置绑定之前需要缩小图像。不过感谢您的建议。 -
在这种情况下,如果您没有得到更好的答案并且感到有点绝望,那么“数据太多”并不一定是问题,因为这些数据往往会失去空间局部性,例如,通过具有如此宽的扫描线和整个图像的连续页面大小。实际上,处理 80x80 像素 10,000 次(取决于图像处理内存访问模式)比处理 8000x8000 像素一次要快得多,这似乎违反直觉。将图像分解成更小的图像并将它们拼接在一起应该会带来很大的好处。
标签: wpf image performance leadtools-sdk