QT5字体在各种平台上渲染不同

我想做一些自定义小部件渲染的可重复testing。 为了做到这一点,我把它们绘制到一个QImage上,并将结果保存为PNG。 与MacOSX相比,Windows的输出真的不同。

我照顾了:

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

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

**

我把这个问题归结为一个简单的渲染testing程序。 所以代码如下所示:

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"); 

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

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

在这里输入图像说明


在下面的N1ghtLight的回答和评论,并阅读他build议的链接后,我改变了代码,以获得字体:

 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); 

这似乎主要是解决大小不同的字体的问题。 至less在MacOSX上,字体现在正好是10个像素。 在Windows上,虽然字体变得更薄,也更小。 我仍然迷茫和困惑…

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

在这里输入图像说明


在下面的G_G的回答中,我调整了代码(Linux?移动平台呢?这变得非常复杂…)。 现在Windows和MacOSX的输出字体都是10像素,但是仍然有很大差异(左边是MacOSX,右边是Windows)。

在这里输入图像说明

谢谢。

Solutions Collecting From Web of "QT5字体在各种平台上渲染不同"

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

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

在Macintosh显示器上,名义分辨率为72点/英寸(dpi),因此72像素宽的图形在概念上将是1英寸宽,但显然实际大小取决于个人显示器。 但是,它总是会打印一英寸宽。

但在Windows显示器上,分辨率通常是96 dpi。 这意味着,虽然图片仍然是72像素宽,但会打印在0.75英寸。

 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); 

这是因为你设置的像素大小。 你需要使用setPointSize()来代替。

从Qt 5文档:

 void QFont::setPixelSize(int pixelSize) 

将字体大小设置为像素大小像素。 使用此功能会使字体设备相关。 使用setPointSize()或setPointSizeF()以独立于设备的方式设置字体的大小。

此外,更多的信息,你可以检查这个职位。 这种差异是由于不同操作系统上的显示密度不同造成的。 我自己在一个OS X,Windows跨平台项目上遇到过这样的问题。


[更新]经过我的额外研究,我发现,目前的Qt字体行为只是一个错误。 这就是为什么上面的解决方案不起作用(它适用于Qt 4) 这里描述了解决这个问题的不同解决方法。 祝你好运!

你可以试试这个 这将生成一个图像与你将写的文字。 我使用这个代码。

 QPixmap photo; QFont qfont; QPainter painter; QString txt; QImage img(x,y,QImage::Format_RGB32); painter.begin(&img); img.fill(0xffffffff); painter.drawPixmap(0,0,x,y,photo); qfont.setFamily("Sampige"); qfont.setPixelSize(28); painter.setFont(qfont); txt = QString::fromUtf8("ನಮಸ್ಕಾರ"); painter.drawText(1,26,txt); painter.end(); img.save("abcd.jpg");