9

svgファイルをラスター化するときに、結果のpngファイルの幅と高さを設定できるようにしたいと思います。次のコードでは、キャンバスのみが目的の幅と高さに設定され、元のsvgファイルのサイズを持つ実際の画像コンテンツが(500、600)キャンバスの左上隅にレンダリングされます。

import cairo
import rsvg

WIDTH, HEIGHT  = 500, 600
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, WIDTH, HEIGHT)

ctx = cairo.Context(surface)

svg = rsvg.Handle(file="test.svg")
svg.render_cairo(ctx)

surface.write_to_png("test.png")

画像コンテンツをカイロキャンバスと同じサイズにするにはどうすればよいですか?私は試した

svg.set_property('width', 500)
svg.set_property('height', 500)

しかし得た

TypeError: property 'width' is not writable

また、librsvg pythonバインディングのドキュメントは非常にまれで、cairoサイトにあるランダムなコードスニペットのみです。

4

2 に答える 2

5

librsvgにはサイズ変更機能がありますが、非推奨です。

カイロでスケールマトリックスを設定して、図面のサイズを変更します。

  • cairoコンテキストでスケール変換行列を設定します
  • .render_cairo()メソッドを使用してSVGを描画します
  • サーフェスをPNGに書き込む
于 2009-07-27T10:12:28.313 に答える
3

これは私のために働くコードです。上記のLuperによる回答を実装します。

import rsvg
import cairo

# Load the svg data
svg_xml = open('topthree.svg', 'r')
svg = rsvg.Handle()
svg.write(svg_xml.read())
svg.close()

# Prepare the Cairo context
img = cairo.ImageSurface(cairo.FORMAT_ARGB32, 
      WIDTH, 
      HEIGHT)
ctx = cairo.Context(img)

# Scale whatever is written into this context
# in this case 2x both x and y directions
ctx.scale(2, 2)
svg.render_cairo(ctx)

# Write out into a PNG file
png_io = StringIO.StringIO()
img.write_to_png(png_io)    
with open('sample.png', 'wb') as fout:
    fout.write(png_io.getvalue())
于 2014-10-01T03:30:09.190 に答える