You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何提高QImage的DPI会导致绘制的文本尺寸增大?

问题:提高QImage的DPI反而让绘制文本变大的原因

通常情况下,仅提高DPI而不修改其他参数时,图像/文本的尺寸应该缩小——因为每英寸会绘制更多像素点。但在下面的PyQt6代码中,提高QImage的DPI却导致绘制的文本尺寸增大,和预期不符,这是为什么?

import sys

from PyQt6.QtCore import Qt
from PyQt6.QtGui import QFont, QImage, QPainter
from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget

DEFAULT_WIDTH = DEFAULT_HEIGHT = 250


class QPainterWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.image = QImage(DEFAULT_WIDTH, DEFAULT_HEIGHT, QImage.Format.Format_RGB32)
        self.image.fill(Qt.GlobalColor.green)
        self.image.setDevicePixelRatio(1)
        print(self.image.dotsPerMeterX())
        self.image.setDotsPerMeterX(25000) # 5000, 10000, 15000, 20000
        self.image.setDotsPerMeterY(25000)
        
        painter = QPainter(self.image)
        
        point_size_font = QFont('arial')
        point_size_font.setPointSizeF(1)
        painter.setFont(point_size_font)
        painter.drawText(0, 0, DEFAULT_WIDTH//2, DEFAULT_HEIGHT//2, Qt.AlignmentFlag.AlignCenter, "point font text")
        painter.end()

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawImage(0, 0, self.image)      
        painter.end()


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.resize(DEFAULT_WIDTH, DEFAULT_HEIGHT)
        self.setCentralWidget(QPainterWidget())


app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()

原因分析

核心问题在于:Qt中点大小(Point Size)的字体是基于设备DPI计算像素尺寸的。

排版领域里1点等于1/72英寸,是物理尺寸单位。当你调用setPointSizeF(1)时,Qt会用以下逻辑计算文本的像素尺寸:
像素尺寸 = 点大小 × (设备DPI / 72)

在你的代码里:

  • 提高QImage的DPI(比如25000 dots/米≈635 DPI),相当于告诉Qt这个"虚拟设备"的分辨率更高
  • 但你固定了字体的物理尺寸(1点),Qt就会生成更多的像素来填充这个物理尺寸,最终文本的像素尺寸自然变大

你预期的"提高DPI文本缩小",是建立在固定文本像素尺寸的前提下:相同像素数在更高DPI的设备上,物理尺寸会更小。但这里你用的是物理尺寸单位(点),逻辑正好相反。

解决方法

如果想要实现你预期的效果(提高DPI时文本像素尺寸缩小,物理尺寸不变),直接改用像素大小设置字体即可:

point_size_font.setPixelSize(8)  # 固定像素尺寸,不受DPI影响

这样不管QImage的DPI如何变化,文本的像素数量固定,高DPI下物理尺寸会自动缩小,符合你的初始预期。

内容的提问来源于stack exchange,提问作者J. Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:01:06