2016-11-05 16 views
0

私は与えられたttfファイル内のすべてのグリフの2次ベジエ曲線情報を抽出することに興味があります。現在、Pythonでttfqueryライブラリを使用して、私は次のように(例えばaなど)指定されたグリフの輪郭を抽出することができる午前:pythonの.ttfフォントファイル内のすべてのグリフの境界ボックスとベジエ曲線データを取得する

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です。

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

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

g = glyph.Glyph(char) 

を交換し、あなたのコードは動作するはずです:ttyqueryは、そのマップにアクセスするためのAPIを持っています。

+0

ニースは、グリフ名も取得する必要があることを認識していませんでした。サイドの質問:フォントに存在する可能性のあるglpyhをすべて取得する方法はありますか?すべてのグリフのベジェ曲線データを1つずつ取り出すのではなく、自動的に生成するのが理想的です。ご協力いただきありがとうございます。 – CodeSurgeon

+0

'f.getGlyphNames'はフォント内のすべてのグリフの名前を返します。 ttyqueryが 'cmap'全体を取得するための公式のAPIを持っていると思わないなら、' f ['cmap'] 'で手作業で作業しなければなりません。 – Phillip

+0

パーフェクトはcmapについて学びます。どうもありがとうございます! – CodeSurgeon

関連する問題