Получить контурные координаты глифа шрифта в Python

Мне нужно извлечь регулярные разнесенные граничные координаты глифов из файла OTF, чтобы нарисовать их (приблизительно) как форму, состоящую из прямых сегментов. То есть для данной строки'draft'Я хочу прочитать соответствующие глифы из файла OTF (если возможно, используя лигатуры, когда это необходимо) и вычислить их координаты контура (скажем, с размером шрифта 100 единиц и интервалом координат около 1 единицы), чтобы нарисовать их в контекст, в котором я могу рисовать только фигуры, состоящие из прямых линий. Мне нужно сделать все это с помощью Python (хотя вызов внешних инструментов командной строки, безусловно, будет нормальным).

После небольшого поиска в Интернете, у меня сложилось впечатление, что я смогу добраться туда (или почти туда), используя fontTools, но мне не удается найти в документации то, что мне нужно. Он довольно длинный и не содержит большого количества примеров, поэтому мне сложно определить, есть ли в нем то, что мне нужно.

  • Является fontToolsинструмент для меня? Если нет, могу ли я использовать библиотеку Python?
  • Как я могу прочитать правильные глифы из файла OTF?
  • Как я могу интерполировать между контрольными точками глифов?

1 ответ

да, fontTools идеально подходит для вас!

Если у вас есть OTFфайл, который вы найдете найти чертеж в CFF или же CFF2стол. я рекомендую бежать ttx font.otfи проверить вывод xmlфайл, чтобы понять структуру.

Ты cffтаблица, вероятно, будет подпрограммирована. Это означает, что части контура сохраняются как «элементы» и используются во всех шрифтах для уменьшения веса. Это заменяет компоненты, известные из TrueTypeшрифты. Просто беги subroutinizeметод на CFFtable, и вы сможете прочитать все, что вам нужно.

Фрагмент, заменяющий каждый глиф в списке с именем 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?

Другие вопросы по тегам