gpt4 book ai didi

windows - QT5字体在各个平台渲染不同

转载 作者:可可西里 更新时间:2023-11-01 12:21:36 26 4
gpt4 key购买 nike

我想对一些自定义小部件渲染进行可重现测试。为此,我将它们绘制到 QImage 上并将结果保存为 PNG。与 MacOSX 相比,Windows 上的输出确实不同。

我照顾了:

  • 在所有平台上选择相同的字体(我提供“TTF”字体文件并将代码指向它)
  • 在 QImage 而不是 QPixmap 上绘图,正如文档所说,QImage 画家应该是平台无关的
  • 我还选择了 Antialisating 和 TextAntialiasing 提示
  • 通过 QFontDatabase::font() 请求字体,以便指定 pointSize 而不是 pixelSize

如何确保渲染在所有平台上完全相同,以便我的测试运行可重现?换句话说,是否有可能强制 QT5 在所有平台上使用相同的字体引擎(例如 freetype)?

**

我将问题确定为一个简单的渲染测试程序。所以代码看起来像:

QFontDatabase fontDb;
fontDb.addApplicationFont(".../fonts/Vera.ttf");

QImage result(width, height, QImage::Format_RGB32);
QPainter painter(&result);
painter.setRenderHint(QPainter::Antialiasing);
painter.setRenderHint(QPainter::TextAntialiasing);


QBrush background(QColor(205, 205, 205));
painter.fillRect(0, 0, 800, 600, background);

QFont font = fontDb.font("Bitstream Vera Sans", "Normal", 10);
painter.setFont(font);

painter.setPen(QColor(0, 0, 0));
painter.drawText(10, 10, "ABCD abcd 01234567");

例如,可以在 fontsquirel.com 下载 Bitstream Vera 字体。

查看在 MacOSX(左)和 Win32(右)上的结果,它们非常不同:

enter image description here


按照下面 N1ghtLight 的回答和评论,并阅读他建议的链接后,我更改了代码以获取字体:

QFont font = fontDb_->font(("Bitstream Vera Sans", "Normal", -1);

qreal screenDPI = QApplication::primaryScreen()->physicalDotsPerInch();
qreal RENDER_DPI = 72;

int pixelSize = (int)((qreal)10 * screenDPI / RENDER_DPI);
font.setPixelSize(pixelSize);

这似乎主要解决了字体大小差异很大的问题。至少在 MacOSX 上,字体现在正好是 10 像素高。在 Windows 上,虽然字体变得更细,也更小了一点。我仍然迷茫和困惑......

这是新的结果(左边是 MacOSX,右边是 Windows)。白色标尺表示真正的 10 像素大小。

enter image description here


根据下面 G_G 的回答,我修改了代码(Linux 怎么样?移动平台?这变得非常复杂......)。现在 Windows 和 MacOSX 上的输出字体都是 10 像素,但渲染仍然非常不同(左边仍然是 MacOSX,右边是 Windows)。

enter image description here

谢谢。

最佳答案

您的渲染 DPI 变量对于 Windows 应该是 96,对于 OSX 应该是 72

根据: http://www.rfwilmut.clara.net/about/fonts.html

On a Macintosh monitor, the notional resolution is 72 dots-per -inch (dpi), so that a graphic 72 pixels wide would notionally be 1 inch wide - though obviously the actual size would depend on the individual monitor. However it will always print one inch wide.

But on a Windows monitor the resolution is (usually) 96 dpi. This means that though the picture is still 72 pixels wide, it will print at 0.75 inches.

QFont font = fontDb_->font(("Bitstream Vera Sans", "Normal", -1);
qreal screenDPI = QApplication::primaryScreen()->physicalDotsPerInch();

#ifdef WINDOWS
qreal RENDER_DPI = 96;
#else
qreal RENDER_DPI = 72;
#endif

int pixelSize = (int)((qreal)10 * screenDPI / RENDER_DPI);
font.setPixelSize(pixelSize);

关于windows - QT5字体在各个平台渲染不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25761556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com