渲染在python中的矢量字母

时间:2012-08-21 19:40:08

标签: python svg rendering vector-graphics

我想渲染一个truetype字母与python中的shapely模块一起使用。 (假设我希望对字母进行一些形态学操作。)

到目前为止,我设法使用cairo写了一封SVG文件(见下文)。该字母在文件头中保存为曲线。曲线基本上是我需要的,但我相信必须有一个更优雅的方式来获得曲线,而不是保存,处理和加载SVG文件。

第二项任务是以适合的形式加载曲线,但我认为可以这样做。

#!/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()

提前感谢您的提示!

<小时/> 编辑:我发现,使用text_path()可以绘制一条真实的曲线而不是show_text(),但我仍然无法读取这些点......

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(在Bezier曲线中)。这可能对某人有用。

#!/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插件是非常令人沮丧的,但我仍然认为这是完成任务的最佳方式。

1 个答案:

答案 0 :(得分:1)

您可能需要直接使用FreeTypeglyph-vector.py example显示了如何获取字形矢量信息。