【问题标题】:QPainter::rotate disables antialiasing of drawn textQPainter::rotate 禁用绘制文本的抗锯齿
【发布时间】:2011-11-03 13:28:08
【问题描述】:

我使用 QPainter::setRenderHint(QPainter::Antialiasing, true) 告诉 Qt 我希望它对我所做的任何绘图进行抗锯齿处理(在这种情况下,使用 drawText() 绘制的文本)。

这工作正常,文本看起来不错,直到我想旋转我正在绘制的像素图,例如

Painter.translate(0, height());
Painter.rotate(-90);

(将 QPainter 逆时针旋转 90 度并将其重新显示)

rotate() 的调用似乎对任何绘制的文本禁用抗锯齿 - 文本以正确的旋转方式绘制,但没有抗锯齿。其他事情似乎不受影响 - 例如。 drawLine() 仍然画出很好的抗锯齿线。

知道我做错了什么吗?

编辑:不出所料,将文本添加到路径然后填充该路径会给我抗锯齿、旋转的文本。如果可能的话,我宁愿避开这条路线。

编辑(再次):我尝试在我正在使用的字体上使用QFont::setStyleStrategy(QFont::PreferAntialias),但没有效果。然而,更多的实验表明,像 Arial 这样的基本字体在旋转时仍会产生抗锯齿文本,而我的自定义字体(对于任何感兴趣的人来说,Swiss721 BlkCn BT)不会。此外,虽然这个问题在 Windows 7 上存在,但在 Ubuntu 上运行时我没有同样的问题。 This FAQ article 似乎暗示 Qt 依靠主机操作系统来处理字体抗锯齿,那么 Windows 在处理这种特定字体(它是 TrueType,就像 Arial 一样)的呈现时可能会遇到什么样的问题?

编辑(最后一次,我保证):将字体大小增加到 16pt 或以上可以解决问题。似乎问题在于将我的特定字体渲染到 16pt 以下 - 可能与上述博客文章中提到的内容有关?:

在 Windows 2000 上,字体通常不会在一定范围内(例如 8-16 号)进行抗锯齿处理,以使文本更加清晰易读。

【问题讨论】:

  • 我想我可能已经在这里回答了我自己的问题,但如果有人有任何进一步或相关的信息,我仍然会非常感兴趣。

标签: qt antialiasing qpainter


【解决方案1】:

实际上我最近有机会参与到这部分 Qt 代码中,我认为您看到的行为与 Qt 中的以下两个错误有关:

如果我没记错(不是 100%)肯定,您实际看到的是 Windows 上 ClearType 渲染的丢失。当应用了转换时,Qt 以抛出 ClearType 信息的方式获取字形像素,因此看起来更加参差不齐。

如果您想自己查看代码,最有可能的地方是/src/gui/text/qfontengine_win.cpp。您也可以尝试关闭 ClearType,看看它们是否相似。

【讨论】:

  • 这很有意义,戴夫,谢谢。关闭 cleartype 确实会导致字符在旋转时以相同的像素绘制。 This forum thread(尤其是 Ingvarr 的 cmets)以及 Wikipedia article 解释了使 ClearType 工作的基本原理如何也将其限制为仅使用水平文本。
【解决方案2】:

一个“猜测”与您的 RenderHint 有关。你在这里使用QPainter::Antialiasing。文档:“指示引擎应该尽可能消除基元边缘的锯齿。”线条、矩形等基元。请改用QPainter::TextAntialiasing

注意:RenderHints 是标志,因此您可以根据需要对它们进行位或运算(听起来确实如此)。

【讨论】:

    猜你喜欢
    • 2016-10-19
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    相关资源
    最近更新 更多