如何在WPF中拉伸位图而不平滑像素

20

我正在开发一个用WPF编写的SEM图像处理应用程序。我有一个图像显示控件,它是从Canvas派生的,可以使用DrawingVisuals显示图像和覆盖层(每个"层"对应一个DrawingVisual)。它还实现了缩放和平移,使用比例和移动转换应用于DrawingVisuals。

当我缩放图像以查看单个像素时,它们以平滑的方式显示,显然使用双线性过滤来拉伸位图(毫不奇怪,因为WPF是通过Direct3D渲染的)。然而,对于我的用例,我宁愿看到单个像素作为清晰的方块,就像在任何图像编辑器(如Photoshop)中一样。这就是为什么我的应用程序用户会缩放图像 -> 以便能够在像素级别上操作。

在WPF中是否有这样的选项(除了在显示位图之前手动拉伸它之外)?我找不到任何信息。

提前感谢, Zbynek Vrastil 捷克共和国

2个回答

22

终于找到了一个答案,在Experts Exchange的帮助下。RenderOptions类定义了附加属性BitmapScalingMode,可以将其设置为NearestNeighbor。

RenderOptions.SetBitmapScalingMode(imageDisplay, BitmapScalingMode.NearestNeighbor);

有用。

Zbynek Vrastil


太棒了!省去了我很多麻烦。 - Padu Merloti
12
你也可以从XAML设置它:<Image RenderOptions.BitmapScalingMode="NearestNeighbor" />。该设置可实现最近邻插值缩放模式。 - Kevin Gosse

1
恕我泼冷水,但如果NearestNeighbor的工作方式类似于GDI+,那么这将带来有限的成功。随着在高对比度区域增加放大倍数,您可能无法获得期望的结果。在GDI+中,您会发现黑色变成蓝色,白色变成红色 - 再次强调,这仅发生在高对比度区域!如果在WPF中不是这种情况,那就算你幸运了!
也许一个WCF开发人员可以确认一下?
我发现还有更多要考虑的选项,但我只能谈论GDI+的Graphics类,这对某些人可能有用。
Graphics graph = e.Graphics;
graph.InterpolationMode = InterpolationMode.NearestNeighbor;
graph.CompositingQuality = CompositingQuality.AssumeLinear;
graph.SmoothingMode = SmoothingMode.None;

这对我有用。我认为SmoothingMode是关键。希望这能帮助其他人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接