2009-07-09 86 views
3

我有一个16位灰度图像,我想在.NET 3.5 sp1中使用WPF进行显示。目前,我使用嵌入式winform显示该图像,该图像使用OpenGL将图像显示格式设置为Luminance 16.WPF图像和DirectX SurfaceFormat

DirectX具有类似的属性,SurfaceFormat

我希望能够以显示WPF的图像和SurfaceFormat设置为Luminance16。我怎么做?

注意:目前,尽管WPF本身支持Gray16,它不会呈现Gray16正常。

编辑:真正的答案是,WPF并没有做它所说的。 Gray16在本地支持的情况下,实际上被256除以适合16位显示器。所以,格雷格16格式是一个谎言,在眼睛里像酸一样燃烧。

回答

2

你不应该在WPF中这样做。

WPF支持16bpp grayscale images natively。我相信它们可以使用内置的TIFF格式解码器从TIF文件加载。


编辑的效应初探评论:

如果您不满意WPF中的默认呈现,您还可以使用DirectX直接呈现在表面。这是最好的(使用C++/CLI),但完全可以在C#中使用SlimDX。

最好的办法无非是要使用D3DImage。有一个介绍在CodeProject上使用它。考虑到DX的不同,你应该能够直接移植你的OpenGL代码。但D3DImage的好处在于,您不再需要托管一个通用控件 - 您可以将其直接放入WPF画笔中,并在WPF中的任何位置使用它。

+0

是的,但在现实中,我这样做。原生支持导致图像抖动,就好像它们在OpenGl中显示为8位亮度图像一样。 – mmr 2009-07-09 16:50:16

+0

@mmr:我编辑了我的答案更多的信息。 – 2009-07-09 17:15:13

0

WPF是不是真正的问题 - 大多数屏幕不支持16位输出,因此,你需要压缩灰度级到8位的16位。

这可以通过除以256或通过使用基于直方图算法潜水2^16个灰度级到另一方式256个箱来完成。

为此,图像处理是必需的,并且有许多关于不同方法的文章(搜索显示高动态范围图像)。您可以使用HLSL着色器来提供帮助。