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

如何在Python中获取字体数据?对标JS的font-measure工具

在Python中获取精确的字体度量参数(ascender、capHeight等)

我们在JavaScript环境下,通过font-measure工具可以获取到如下字体度量数据:

ascender: 0.95
capHeight: 0.89
height: (fontData.ascender - fontData.descender) * -1;//计算后为1.4
median: 0.47

现在需要在Python中获取这些精确的参数值,尝试使用PIL的ImageFont进行获取,代码如下:

from PIL import ImageFont

text = 'sphinx'
H = 100
font = ImageFont.truetype(font, H, encoding='utf-8')
ascent, descent = font.getmetrics()
(width, baseline), (offset_x, offset_y) = font.font.getsize(text)

但得到的数值并不准确,也无法明确这些参数与目标度量值的对应关系,希望得到解决方法。

JS工具获取结果截图
Python尝试结果截图


解决方案:使用fontTools库获取精确字体度量

PIL的ImageFont对字体内部度量的支持有限,想要获取和font-measure一致的精确参数,推荐使用fontTools库,它能直接读取字体文件的底层度量数据。

1. 安装fontTools

pip install fonttools

2. 编写代码获取目标参数

from fontTools.ttLib import TTFont

font_path = "你的字体文件路径.ttf"
font = TTFont(font_path)

# 读取字体核心度量表
hhea_table = font['hhea']
os2_table = font['OS/2']
head_table = font['head']

# 字体em单位大小,用于转换为比例值
em_size = head_table.unitsPerEm

# 转换为font-measure对应的比例值
ascender = hhea_table.ascender / em_size
cap_height = os2_table.sCapHeight / em_size
total_height = (hhea_table.ascender - hhea_table.descender) / em_size
median = os2_table.sxHeight / em_size

# 输出结果
print(f"ascender: {ascender:.2f}")
print(f"capHeight: {cap_height:.2f}")
print(f"height: {total_height:.2f}")
print(f"median: {median:.2f}")

参数对应关系说明

  • hhea_table.ascender → font-measure的ascender,除以em大小得到比例值
  • os2_table.sCapHeight → font-measure的capHeight
  • (hhea_table.ascender - hhea_table.descender)/em_size → font-measure计算后的height
  • os2_table.sxHeight → font-measure的median(即x-height)

关键说明

font-measure返回的是相对于字体em大小的比例值,因此需要将fontTools读取的原始单位值(以em为单位)除以unitsPerEm进行转换,这样结果就能和JS端完全对齐。


内容的提问来源于stack exchange,提问作者Asaf Strilitz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:48:23