禁用WPF图像上的抗锯齿功能

时间:2009-11-15 21:43:58

标签: c# .net wpf user-interface antialiasing

我正在编写一个小的“登录”对话框,并且出于审美原因在对话框的顶部嵌入了横幅。一切顺利,除了默认情况下,WPF反对别名整个图像,使其中包含的文本令人沮丧模糊。

经过一些搜索后,前几页的结果显示,人们普遍认为在WPF中无法禁用抗锯齿功能。可以确认,否则否认这个?

对我来说这是一个小问题 - 我会从图像中取出文本,然后在背景图像上叠加带有相同文字的标签以达到同样的效果(虽然我必须承认,它有点烦人)。

谢谢, 罗布

2 个答案:

答案 0 :(得分:17)

据我所知,WPF在缩放位图时总是进行抗锯齿处理。但是,您应该能够通过避免位图缩放来实现目标。

有两个步骤:

  1. 在图片上设置SnapsToDevicePixels="true"
  2. 在图像上设置ScaleTransform以缩放它,使一个设备像素=一个位图像素
  3. 要计算所需的ScaleTransform,请计算屏幕的DPI,如下所示:

    var DPI = Win32Functions.GetSystemMetrics(SM_CYICON) / SystemParameters.IconHeight * 96;
    

    然后对于位图,执行:

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

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

    如果您确实希望在高DPI屏幕上拉伸图像但不使用抗锯齿(例如,将所有像素加倍),只需使用您喜欢的任何算法在您自己的代码中拉伸位图,并将上述内容与拉伸位图一起使用

答案 1 :(得分:3)

这不是真正的抗锯齿 - 它是导致问题的子像素定位,我在我的博客上写过它(以及解决问题的控件):

http://www.nbdtech.com/blog/archive/2008/11/20/blurred-images-in-wpf.aspx