给定字符串、字体、显示长度如何计算实际字号及获取字体设计高度
固定显示长度适配字号的正确计算方案
高度计算偏小的核心原因
glyf表中单个字符的yMax - yMin仅为该字符本身的字面高度,并非字体的全局设计基准高度。字体的设计尺寸统一以head表中的unitsPerEm(简称UPM,即每em的设计单位数)为基准,常见值为1000、1024、2048,单个字符的高度永远不会超过这个基准值,因此用单个字符高度计算自然会得到偏小的结果。
适配固定水平长度的字号计算逻辑(无需单独计算字符高度)
要实现字符串适配固定水平显示长度,直接使用水平参数即可完成计算,无需调用高度相关字段,步骤如下:
- 遍历目标字符串的所有字符,从
hmtx表提取每个字符的advance width(步进宽度),求和得到总设计宽度W(单位为字体设计单位) - 读取字体
head表的unitsPerEm字段,记为UPM - 按以下公式计算适配的字号(单位:磅,印刷行业默认1磅=1/72英寸):
字号 = (目标显示长度(英寸) * 72 * UPM) / W
示例计算
以问题给出的参数为例:
- 目标显示长度:1英寸
- 字体:Arial(UPM为1024)
- 字符串"hello world!"的总步进宽度:假设求和后为5000设计单位
则对应字号为(1 * 72 * 1024) / 5000 ≈ 14.75磅,按该字号渲染后字符串总宽度恰好为1英寸。
字体全局设计高度获取方法
如果业务场景确实需要获取字体的高度参数,可按需求选择对应字段:
- 标准em设计高度:直接取
head表的unitsPerEm值,这是所有字号换算的基准 - 字体最大显示高度(包含所有重音、上下标的最大显示范围):取
OS/2表的sTypoAscender - sTypoDescender + sTypoLineGap,该值为字体设计的标准行高对应的设计单位值
内容的提问来源于stack exchange,提问作者xuke
相关产品推荐
相关产品推荐

