原生WPF与自定义DirectX用于显示大图像

我需要加快我的图像查看器,并想知道我是否应该考虑创建自己的DirectX控件来执行此操作。

我的图像查看器显示医学图像。 它们可能非常大。 乳房X线照相术我们说的是55mb。 像素数据是存储在ushortarrays中的16位灰度级。 在没有深入细节的情况下,我目前的方法是将像素数据加载到ImageSource中,并使用WPF Image控件。

我从未对DirectX做过任何事情。 值得深入探讨吗? 它会比原生WPF更快吗? 如果这样有多大? 或者,我应该忘记DirectX并研究可以改进现有方法的领域吗?

在有人这么说之前,我知道WPF使用DirectX。 我想知道如果删除WPF层并自己编写DirectX将提高性能。

我有一些绘制数千兆卫星和图表图像的经验。 使用大约55MB的图像应该可以正常工作,即使没有尝试过多地优化它。 你还没有给出足够的细节来推荐另一种替代品,所以我会就利弊给出我的看法。

使用2D窗口API将是最简单的实现,如果您不需要旋转并且只是想显示图像并缩放和平移,则应该始终足够快。 如果您将其视为一个大图像,那么当缩小时,如果您使用半色调绘制以提供漂亮的平滑图像,则性能将不会那么好。 这是因为它每次绘制时都必须有效地读取所有55mb的图像。

要解决此性能问题,您可以制作多个位图,有效地对映像进行映射。 缩小时,您可以选择最接近您要绘制的分辨率的降低分辨率的图像。 如果你不熟悉mip-mapping,这里有一个维基百科链接:

http://en.wikipedia.org/wiki/Mipmap

使用DirectX实现它将是困难的10倍。 不同的图形硬件具有不同的最大纹理尺寸 很可能你需要将图像分解为多个纹理来绘制,你还必须跟踪渲染状态,查看矩阵等。

但是,如果您使用DirectX,则可以实现大量实时照片调整您可以通过简单地调整视图矩阵来进行实时旋转。 您可以在像素着色器中轻松实现实时对比度,亮度,灰度系数和清晰度。

我可能会建议另外两个API。 如果您愿意将自己限制在Vista或更高版本,那么Direct2D将比Direct3D简单一些。 此外,如果您需要在非Windows平台上实现它,我建议使用OpenGL。 我目前的项目是Direct3D,因为几年前当我们开始使用OpenGL时,OpenGL落后了,我没有预见到Android设备的普及。 我现在希望我们使用OpenGL。

尝试分析以查看WPF花费时间的位置。 您是以原始分辨率显示图像吗? 如果不是,那么进行一些预处理并创建1/2分辨率版本可能是值得的。