在WPF图像上禁用抗锯齿

13

我正在编写一个小型的登录对话框,并在对话框顶部嵌入了一个横幅,以美观为出发点。一切都很顺利,但默认情况下,WPF会对整个图像进行抗锯齿处理,导致其中包含的文本非常模糊。

经过一番搜索,前几页的结果显示,普遍认为WPF无法禁用抗锯齿功能。是否有人可以确认或否认这个说法呢?

对我来说,这只是一个小问题——我将从图像中取出文本,然后在背景图像上叠加具有相同文本的标签,以达到相同的效果(虽然我必须承认,这有点令人恼火)。

谢谢, Rob


避免亚像素问题的另一种(自动)方法:https://dev59.com/NmTWa4cB1Zd3GeqPHuOM#16984921 - MaMazav
请注意,如果 Windows DPI 设置已被修改(例如使用 125% 或 150% 的字体大小),则可能会出现完全相同的问题。这也会导致位图被放大,使得事物看起来“有趣”(或者说,丑陋...)。我们可以添加一个单独的问题来解决这个问题,因为答案/解决方案非常相似。 - Per Lundberg
2个回答

18
据我所知,当缩放位图时,WPF始终进行抗锯齿处理。但是,通过避免位图缩放,您应该能够实现您的目标。
具体步骤如下:
1. 在图像上设置SnapsToDevicePixels="true" 2. 在图像上设置ScaleTransform以缩放它,使一个设备像素等于一个位图像素
为了计算所需的ScaleTransform,请按如下方式计算屏幕的DPI:
var DPI = Win32Functions.GetSystemMetrics(SM_CYICON) / SystemParameters.IconHeight * 96;

然后对于位图,执行:

var scale = bitmapDPI / DPI;
var transform = new ScaleTransform(scale, scale);

这将使得您的位图像素与设备像素完全匹配。WPF 不会拉伸位图,因此不应该出现反锯齿。

如果您想在高 DPI 屏幕上拉伸图像但又不希望出现反锯齿(例如将所有像素加倍),只需在自己的代码中使用任何算法来拉伸位图,并使用上述方法处理已经拉伸过的位图。


谢谢Ray - 今天你的评论真的帮了我很多!我正在使用InteropBitmap作为Image的源,但它总是被缩放得非常丑陋(即使位图DPI为96,这与显示DPI不同)。添加一个ScaleTransform来“缩小它”有所帮助,现在看起来就像应该的样子。我会给你发奖金,但由于SO的限制,我必须等待23个小时才能给你。 :) - Per Lundberg
赏金已经按照承诺发放了。 :) 我同时也稍微改进了你的答案。 - Per Lundberg

4

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