【问题标题】:Disabling antialiasing on a WPF image [closed]在 WPF 图像上禁用抗锯齿 [关闭]
【发布时间】:2010-12-16 20:58:03
【问题描述】:

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

经过一番搜索,前几页的结果表明,人们普遍认为 WPF 中不能禁用抗锯齿。任何人都可以确认或以其他方式否认这一点吗?

这对我来说是一个小问题 - 我会从图像中取出文本,而是在背景图像顶部叠加一个具有相同文本的标签以达到相同的效果(尽管我必须承认,这有点烦人)。

谢谢, 抢

【问题讨论】:

  • 另一种(自动)避免子像素化的方法:stackoverflow.com/a/16984921/2463642
  • 请注意,如果修改了 Windows DPI 设置(使用例如 125% 或 150% 字体大小),可能会出现完全相同的问题。这也将导致位图被放大,使事情看起来“有趣”(或者更确切地说,丑陋......)。我们可以添加一个单独的问题,因为答案/解决方案非常相似。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    据我所知,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 屏幕上拉伸图像但不使用抗锯齿(例如,将所有像素加倍),只需使用您喜欢的任何算法在您自己的代码中拉伸位图,然后使用上面的拉伸位图.

    【讨论】:

    • 谢谢雷 - 今天这个评论对我帮助很大!我使用 InteropBitmap 作为图像的来源,它总是被缩放到看起来真的很难看(即使位图 DPI 是 96,这与显示 DPI 不同)。添加一个 ScaleTransform 来“缩小它”有帮助,现在看起来应该如此。赏金即将到来,但由于 SO 限制,我必须等待 23 小时才能将其提供给您。 :)
    • 按承诺提供赏金。 :) 我同时也改进了你的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2012-12-13
    相关资源
    最近更新 更多