3

Python の shapely モジュールで使用する truetype 文字をレンダリングしたいと思います。(文字に対して何らかの形態学的操作を行いたいとします。)

今まで、cairo を使用して SVG ファイルに文字を書き込むことができました (以下を参照)。文字は、ファイル ヘッダーに曲線として保存されます。曲線は基本的に私が必要としているものですが、SVG ファイルを保存、処理、ロードするよりもはるかに洗練された方法で曲線を取得する必要があると思います。

2 番目のタスクは、適切に動作する形式で曲線を読み込むことですが、これは実行できると思います。

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import cairo
fo = file('test.svg', 'w')
WIDTH, HEIGHT  = 256, 256
surface = cairo.SVGSurface (fo, WIDTH, HEIGHT) ## Prepare a destination surface -> out to an SVG file!
ctx = cairo.Context (surface)
ctx.scale (WIDTH/1.0, HEIGHT/1.0) # Normalizing the canvas

ctx.move_to (0.1, 0.9)
ctx.set_font_size(1.)
character = "a"
ctx.show_text(character)

surface.finish()

事前にヒントをありがとう!


編集: show_text() の代わりに text_path() を使用して実際の曲線を描くことができることがわかりましたが、それでもポイントを読み取ることができません...

print ctx.text_path("b")
ctx.set_source_rgb (0.3, 0.2, 0.5) # Solid color
ctx.set_line_width (0.02)
ctx.stroke ()


EDIT2: 同僚の助けを借りて、上記と同様の結果を得ることができました。fontforge を使用すると、グリフをレンダリングして SVG (ベジエ曲線) に保存することもできます。それは誰かに役立つかもしれません。

#!/usr/bin/python
# -*- coding: utf-8 -*-
## Outputs a glyph as a SVG, using FontForge (requires package 'python-fontforge')
import fontforge
f = fontforge.open("/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-R.ttf")
g = f["Aring"]
print g
g.export("orig.svg")

必要に応じて、SVG を保存する前に、グリフに対して形態学的膨張を実行することができます。(しかし、これは必要な多くのステップのうちの唯一のステップです。)

g.stroke("circular", 100, "round", "round", "removeinternal")  ## morphologic dilation of the glyph
g.export("stroke.svg")

また、正確なバウンディング ボックスを確立できます。

print "Stroked: g.boundingBox() =", g.boundingBox()

ところで、ささいな Inkscape プラグインを作成しようとするだけでもかなりイライラしますが、それがこのタスクにとって最善の方法であると私は信じています。

4

1 に答える 1

2

おそらくFreeTypeを直接使用する必要があります。このglyph-vector.pyは、グリフベクトル情報を取得する方法を示しています。

于 2012-08-21T19:45:03.253 に答える