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

Point与Pixel的区别是什么?为何Pixel字体不受DPI影响?

Point与Pixel的区别及为何Pixel字体不受DPI影响?

我编写了一个PyQt5脚本,用于验证字体设置与图像DPI的关系:当使用setPixelSize(25)时,绘制的文本字号不会受self.image.setDotsPerMeterX(75)、self.image.setDotsPerMeterY(75)和self.image.setDevicePixelRatio(1)的影响;但使用setPointSizeF(25)时,文本大小会随DPI设置变化。

我的问题是:Point与Pixel的区别是什么?为何Pixel字体不受DPI影响?

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont, QImage, QPainter
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget
import sys  # 补充原代码缺失的sys导入

DEFAULT_WIDTH = DEFAULT_HEIGHT = 250


class QPainterWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.image = QImage(DEFAULT_WIDTH, DEFAULT_HEIGHT, QImage.Format_RGB32)
        self.image.fill(Qt.green)
        self.image.setDevicePixelRatio(1)
        self.image.setDotsPerMeterX(75)
        self.image.setDotsPerMeterY(75)
        painter = QPainter(self.image)

        point_size_font = QFont('arial')
        point_size_font.setPointSizeF(25)
        painter.setFont(point_size_font)
        painter.drawText(0, 0, DEFAULT_WIDTH//2, DEFAULT_HEIGHT//2, Qt.AlignCenter, "point font text")

        pixel_size_font = QFont('arial')
        pixel_size_font.setPixelSize(25)
        painter.setFont(pixel_size_font)
        painter.drawText(0, 0, (DEFAULT_WIDTH//2) + 100, (DEFAULT_HEIGHT//2) + 100, Qt.AlignCenter, "pixel 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()

问题解答

1. Point与Pixel的核心区别

  • Point(磅):印刷出版行业的物理尺寸单位,1磅≈1/72英寸,和物理介质绑定。比如25磅的字体,打印到纸上的物理高度固定为≈0.347英寸,与显示设备无关。
  • Pixel(像素):数字图像/屏幕的最小显示单元,属于数字画布单位。仅对应图像或屏幕上的像素点数量,和物理尺寸无直接绑定——同样25像素的字体,在高分辨率屏幕上物理尺寸小,低分辨率屏幕上物理尺寸大。

2. 为何Pixel字体不受DPI影响

DPI(每英寸点数)的作用是定义数字像素和物理尺寸的换算关系,比如你设置的75 dots per meter(约1.905 DPI),是告诉系统“这个图像每米对应75个像素”。

当调用setPixelSize(25)时,你直接指定了字体在数字图像中要占用的像素点数量,Qt会直接按这个像素数渲染字体,完全跳过DPI换算逻辑——不管图像DPI设置如何变化,字体占用的像素数固定,所以在图像上的显示大小不会改变。

而setPointSizeF(25)是基于物理尺寸的设置,Qt会根据图像DPI计算所需像素数,公式为:像素高度 = 磅数 × DPI / 72。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.20 18:54:26