是否有一种方法可以知道字体是TrueType还是OpenType字体?
我指定字体的扩展对我来说无关紧要,所以ttx.guessFileType(fontPath)对我来说不是一个很好的解决方案。
OpenType vs TrueType?
首先,我们需要定义"opentype"是什么意思。和";TrueType"字体。OpenType字体格式主要是作为TrueType格式的超集开发的,现在大多数带有。otf和。ttf扩展名的字体实际上都是OpenType字体。
字体是OpenType格式吗?
由于OpenType是TrueType的超集,您可以像这样检查。otf或。ttf字体是否为OpenType:
if fontPath.endswith('.otf') or fontPath.endswith('.ttf'):
fontFormat = 'OpenType'
字形轮廓是TrueType(二次型)还是OpenType/CFF(三次型)?
文件扩展名。otf和。ttf理论上是可以互换的,所以避免依赖扩展名是正确的。但大多数时候,扩展名为。otf的OpenType字体包含用三次bezier绘制的字形轮廓,并存储在CFF
或CFF2
表中,而扩展名为。ttf的OpenType字体包含用二次bezier绘制的字形轮廓,并存储在glyf
表中。
因此,如果您不确定文件扩展名,您可以简单地检查字体是否包含glyf
表。
from fontTools.ttLib.ttFont import TTFont
font = TTFont("font.ttf")
if 'glyf' in font:
outlineFormat = "TrueType"
elif 'CFF ' in font or 'CFF2' in font:
outlineFormat = "OpenType/CFF"
else:
outlineFormat = "Unknown/Invalid"
旁注:通常,如果字体包含TrueType轮廓,字体的前四个字节也将被编码为'x00x01x00x00'
,如果字体包含OpenType/CFF轮廓,前我们的字节将被编码为'OTTO'
。在fontTools中,你可以通过TTFont.sfntVersion
属性来检查。
可以查看文件签名:
#!/usr/bin/python3
o = open('font', 'rb')
magic = o.read(5)
if magic.startswith(b'OTTO'):
print('OpenType')
elif magic.startswith(b'x00x01x00x00x00'):
print('TrueType')
else:
print('other')
来源