有没有一种好方法可以统一转换字体的每个字形?
Is there a good way to transform every glyph of a font uniformly?
我对如何使用 fonttools
对特定字体的每个字形应用转换有点困惑。我正在玩一种开源字体,其中每个字符在其边界框中都只是一个太高的 taaaad,所以我希望将其向下转换。
它是一种可变字体(Source Sans)。这是重要的代码示例:
from fontTools import ttLib
from fontTools.pens.transformPen import TransformPen
from fontTools.pens.ttGlyphPen import TTGlyphPen
font = ttLib.TTFont(font_path)
for glyphName in font["glyf"].keys():
print(glyphName)
glyph = font.getGlyphSet().get(glyphName)
glyphPen = TTGlyphPen(font.getGlyphSet())
transformPen = TransformPen(glyphPen, (1.0, 0.0, 0.0, 1.0, 0, -300))
glyph.draw(transformPen)
transformedGlyph = glyphPen.glyph()
font["glyf"][glyphName] = transformedGlyph
但是,当我这样做时,转换并没有完全按预期进行...一些字符向下移动了 很多,而其他字符只向下移动了一点. i
、3
、4
、5
和 6
是一些值得注意的示例,而其他字母和数字不受影响。
通常有更简单的方法来执行此操作吗?如果没有,为什么有些字母的转换方式与其他字母不同?
我知道发生了什么事了。
一些字形由其他嵌套字形组成。这些被称为 复合字形 ,而不是 简单字形 。
因为我要转换所有字形,所以我要转换所有复合字形,以及构成它们的简单字形。这导致复合字形看起来像是被变换了两次。
新代码如下所示:
glyphPen = TTGlyphPen(font.getGlyphSet())
transformPen = TransformPen(glyphPen, Transform().translate(0, -25))
for glyphName in font.getGlyphOrder():
glyph = font['glyf'][glyphName]
# Avoid double-transforming composite glyphs
if glyph.isComposite():
continue
glyph.draw(transformPen, font['glyf'])
font['glyf'][glyphName] = glyphPen.glyph()
我对如何使用 fonttools
对特定字体的每个字形应用转换有点困惑。我正在玩一种开源字体,其中每个字符在其边界框中都只是一个太高的 taaaad,所以我希望将其向下转换。
它是一种可变字体(Source Sans)。这是重要的代码示例:
from fontTools import ttLib
from fontTools.pens.transformPen import TransformPen
from fontTools.pens.ttGlyphPen import TTGlyphPen
font = ttLib.TTFont(font_path)
for glyphName in font["glyf"].keys():
print(glyphName)
glyph = font.getGlyphSet().get(glyphName)
glyphPen = TTGlyphPen(font.getGlyphSet())
transformPen = TransformPen(glyphPen, (1.0, 0.0, 0.0, 1.0, 0, -300))
glyph.draw(transformPen)
transformedGlyph = glyphPen.glyph()
font["glyf"][glyphName] = transformedGlyph
但是,当我这样做时,转换并没有完全按预期进行...一些字符向下移动了 很多,而其他字符只向下移动了一点. i
、3
、4
、5
和 6
是一些值得注意的示例,而其他字母和数字不受影响。
通常有更简单的方法来执行此操作吗?如果没有,为什么有些字母的转换方式与其他字母不同?
我知道发生了什么事了。
一些字形由其他嵌套字形组成。这些被称为 复合字形 ,而不是 简单字形 。
因为我要转换所有字形,所以我要转换所有复合字形,以及构成它们的简单字形。这导致复合字形看起来像是被变换了两次。
新代码如下所示:
glyphPen = TTGlyphPen(font.getGlyphSet())
transformPen = TransformPen(glyphPen, Transform().translate(0, -25))
for glyphName in font.getGlyphOrder():
glyph = font['glyf'][glyphName]
# Avoid double-transforming composite glyphs
if glyph.isComposite():
continue
glyph.draw(transformPen, font['glyf'])
font['glyf'][glyphName] = glyphPen.glyph()