计算字体 truetype hhea 值(上升、下降)

Posted

技术标签:

【中文标题】计算字体 truetype hhea 值(上升、下降)【英文标题】:Computing font truetype hhea values (ascender, descender) 【发布时间】:2013-11-20 06:54:47 【问题描述】:

我正在尝试解析 truetype 字体以构建和存储每个字体大小的升序、降序,我正在使用 http://nodebox.github.io/opentype.js/,它做了一个了不起的工作,但我不明白如何计算返回值。

示例字体 Blackoak (adobe) 我有 [Ascender, Descender] = 1900 和 -5OO

我假设这些数字表示在 em 空间中与基线的距离,但我是否需要其他元信息来计算这些值?

【问题讨论】:

这里的公式得到正确的像素值 = Ascender * scale(fontSize)/unitsPerEm (对于毫米转换只需乘以 25.4 并除以 72 dpi.. 【参考方案1】:

如果您想以像素为单位计算特定字体大小的升序/降序,则需要查找OS/2 表中的sTypoAscendersTypoDescender 值(按照W3C 的说明)。 hhea 表的ascenderdescender 值仅标记font designer's intention,它不一定 必须对应于实际计算值。关于值类型,您是对的,升序和降序以 UPM 为单位,负数表示低于基线。

为了将这些数字转换为特定字体大小的像素,您还需要提取字体中有多少 每个 em 单位。您可以通过读取head 表中的unitsPerEm 值来做到这一点。通常,对于 OTF,其 1000 UPM,对于 TTF - 1024 或 2048 UPM。 sTypoAscendersTypoDescender 的绝对值应加起来为 unitsPerEm 值。然后它只是一个比例问题。

例如,让我们看一下 opentype.js Font Inspector 并假设字体大小为 16px。 unitsPerEm 的值是 2048 UPM,sTypoAscendersTypoDescender 分别是 1536 和 -512 (1536 + 512 = 2048):

 Ascender = 16 * 1536/2048 = 12px  (above baseline)
Descender = 16 * -512/2048 = -4px  (below baseline)

【讨论】:

以上是关于计算字体 truetype hhea 值(上升、下降)的主要内容,如果未能解决你的问题,请参考以下文章

PHP:读取字体文件的 TrueType/OpenType 元数据

Java解析truetype字体以将每个字符提取为图像及其代码

TrueType字体文件提取关键信息

TrueType字体文件提取关键信息

TrueType字体文件提取关键信息

Delphi FMX 开发APP使用TrueType字库做图标(自己使用图标制作字体)