如何在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)
但得到的数值并不准确,也无法明确这些参数与目标度量值的对应关系,希望得到解决方法。
解决方案:使用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计算后的heightos2_table.sxHeight→ font-measure的median(即x-height)
关键说明
font-measure返回的是相对于字体em大小的比例值,因此需要将fontTools读取的原始单位值(以em为单位)除以unitsPerEm进行转换,这样结果就能和JS端完全对齐。
内容的提问来源于stack exchange,提问作者Asaf Strilitz
相关产品推荐
相关产品推荐

