1

我需要从 OTF 文件中提取字形的规则间隔边界坐标,以便将它们(近似)绘制为由直线段组成的形状。也就是说,对于给定的字符串,'draft'我想从 OTF 文件中读取相应的字形(如果可能,在适当的时候使用连字)并计算它们的轮廓坐标(比如字体大小为 100 个单位,坐标间距约为 1 个单位)为了在我只能绘制由直线组成的形状的上下文中绘制它们。我需要使用 Python 来完成所有这些工作(尽管调用外部命令行工具当然可以)。

在网上搜索了一下之后,我的印象是我应该能够使用 到达那里(或几乎到达那里) ,但是我在文档fontTools中找不到我需要的东西。它很长,并且没有包含很多示例,这使我很难确定它是否有我需要的东西。

  • fontTools工具适合我吗?如果没有,是否有我可以使用的 Python 库?
  • 如何从 OTF 文件中读取正确的字形?
  • 如何在字形的控制点之间进行插值?
4

1 回答 1

1

是的 fontTools 非常适合您!

如果您有文件,您可以在或表格OTF中找到绘图。我建议运行并检查输出文件以了解结构。CFF CFF2ttx font.otfxml

cff的表可能会被子程序化。这意味着轮廓的一部分被保存为“元素”并在字体中使用以节省一些重量。这将替换从TrueType字体已知的组件。只需subroutinize在桌子上运行方法CFF,您应该能够阅读您需要的所有内容。

替换列表中每个字形的片段,名为keep_g_names

    def process_cff(self) -> None:
        cff = self.font["CFF "]
        cmap_reversed = {v: k for k, v in self.font.getBestCmap().items()}

        if hasattr(cff, "desubroutinize"):
            cff.desubroutinize()

        content = cff.cff[cff.cff.keys()[0]]  # can it have more fonts?

        for key in content.CharStrings.keys():
            if key in self.keep_g_names:
                continue
            content.CharStrings[key] = content.CharStrings["n"]

这对你有帮助吗?

你是什​​么意思How can I interpolate between the control points of the glyphs?

于 2020-12-23T15:49:52.683 回答