px转pt的正确算法
必要的前言
首先,pt是一个物理常量,是现实世界的度量单位,有确定的数值,1pt = 1/72英尺
。
而像素是一个变量,基于显示设备的参数不同,一个像素的大小也不尽相同。而像素大小的计算方式就是DPI(dots per inch),当然,在现在这个讨论的情景下,其实DPI就是PPI(pixels per inch)。一般我们聊显示器的DPI的时候,我们说的就是PPI。
简单的公式
不想了解原理的话,可以直接拿一个相对通用但不正确的公式:
pt = px * 0.75
计算原理
其实就是小学数学。已知下面的条件
- 1英寸=72 pt
- 1英寸=DPI px
- 求1px=多少pt?
上面公式的由来正是假设DPI是96:
pt = px * 72 / DPI
pt = px * 72 / 96
pt = px * 0.75
举例具体场景来说,把图片的宽度换算成pt单位。整个换算逻辑是:
- 如果源图片指定了 DPI(dots per inch),视作 PPI(pixels per inch),将px单位的宽高换算为pt单位。[1]
- 如果源图片没有 DPI 元数据,则默认为 96 DPI [1]
最终代码是
from PIL import Image
image = Image.open('in.png')
dpi = image.info.get('dpi', 96.0)
ratio = 72.0 / float(dpi)
width_by_pt = image.width * ratio
参考资料: