Получить контурные координаты глифа шрифта в Python
Мне нужно извлечь регулярные разнесенные граничные координаты глифов из файла OTF, чтобы нарисовать их (приблизительно) как форму, состоящую из прямых сегментов. То есть для данной строки'draft'
Я хочу прочитать соответствующие глифы из файла OTF (если возможно, используя лигатуры, когда это необходимо) и вычислить их координаты контура (скажем, с размером шрифта 100 единиц и интервалом координат около 1 единицы), чтобы нарисовать их в контекст, в котором я могу рисовать только фигуры, состоящие из прямых линий. Мне нужно сделать все это с помощью Python (хотя вызов внешних инструментов командной строки, безусловно, будет нормальным).
После небольшого поиска в Интернете, у меня сложилось впечатление, что я смогу добраться туда (или почти туда), используя fontTools
, но мне не удается найти в документации то, что мне нужно. Он довольно длинный и не содержит большого количества примеров, поэтому мне сложно определить, есть ли в нем то, что мне нужно.
- Является
fontTools
инструмент для меня? Если нет, могу ли я использовать библиотеку Python? - Как я могу прочитать правильные глифы из файла OTF?
- Как я могу интерполировать между контрольными точками глифов?
1 ответ
да, fontTools идеально подходит для вас!
Если у вас есть
OTF
файл, который вы найдете найти чертеж в
CFF
или же
CFF2
стол. я рекомендую бежать
ttx font.otf
и проверить вывод
xml
файл, чтобы понять структуру.
Ты
cff
таблица, вероятно, будет подпрограммирована. Это означает, что части контура сохраняются как «элементы» и используются во всех шрифтах для уменьшения веса. Это заменяет компоненты, известные из
TrueType
шрифты. Просто беги
subroutinize
метод на
CFF
table, и вы сможете прочитать все, что вам нужно.
Фрагмент, заменяющий каждый глиф в списке с именем
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?