2016-11-05 10 views
0

Я заинтересован в извлечении квадратичной информации кривой безье всех глифов в заданном файле ttf. В настоящее время, используя библиотеку ttfquery в питона, я могу извлечь контуры данного символа (например, как a) следующим образом:Извлечение данных кривой ограничения и безье для всех глифов в файле шрифта .ttf в python

from ttfquery import describe 
from ttfquery import glyphquery 
import ttfquery.glyph as glyph 

char = "a" 
font_url = "/usr/share/fonts/truetype/liberation/LiberationSerif-Regular.ttf" 
font = describe.openFont(font_url) 
g = glyph.Glyph(char) 
contours = g.calculateContours(font) 
for contour in contours: 
    for point, flag in contour: 
     print point, flag 

Это хорошо работает для алфавитных символов, но он обеспечивает следующий ключ ошибка для чисел, знаков препинания, пробелов и т.д.:

Traceback (most recent call last): 
    File "demo.py", line 9, in <module> 
    contours = g.calculateContours(font) 
    File "/usr/local/lib/python2.7/dist-packages/ttfquery/glyph.py", line 33, in calculateContours 
    charglyf = glyf[self.glyphName] 
    File "/usr/local/lib/python2.7/dist-packages/FontTools/fontTools/ttLib/tables/_g_l_y_f.py", line 185, in __getitem__ 
    glyph = self.glyphs[glyphName] 
KeyError: '!' 

Что является надежным способом получить обе точки кривой Безье, а также ограничивающий прямоугольник каждого глифа (который я в настоящее время вычислительные косвенно с помощью мин и макс x и y, полученные из контуров)?

ответ

3

Символы не обязательно называются символами. В TTF-файле есть структура, которая отображает символы в глифы, cmap. ttyquery имеет API для доступа к этой карте:

>>> ttfquery.glyphquery.glyphName(font, "!") 
"exclam" 

То есть, заменить

g = glyph.Glyph(char) 

с

g = glyph.Glyph(ttfquery.glyphquery.glyphName(f, char)) 

и ваш код должен работать.

+0

Ницца, не понял, что мне нужно было получить имя глифа! Боковой вопрос: есть ли способ получить все возможные glpyhs, которые присутствуют в шрифте? Было бы идеально, чтобы автоматически генерировать дикцию данных кривой Безье для всех глифов вместо того, чтобы их собирать по одному. Спасибо за вашу помощь. – CodeSurgeon

+0

'f.getGlyphNames' дает вам имена всех глифов шрифта. Если вы не думаете, что ttyquery имеет официальный API для получения всего 'cmap', вам придется вручную работать с' f ['cmap'] ', чтобы сделать эту работу. – Phillip

+0

Perfect узнает о cmap. Спасибо огромное! – CodeSurgeon