2009-07-27 16 views
3

svgファイルをラスタライズするとき、結果のpngファイルの幅と高さを設定したいと考えています。次のコードでは、キャンバスのみが希望の幅と高さに設定されているため、元のsvgファイル次元を持つ実際のイメージコンテンツが(500,600)キャンバスの左上隅にレンダリングされます。librsvg Pythonバインディングを使用してsvgイメージファイルのサイズを変更する方法

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) 

を試みたが、カイロのサイト上でのみいくつかのランダムなコードスニペットは極めて稀であると思わ結合librsvgパイソンのための書類も

TypeError: property 'width' is not writable 

を得ました。

答えて

6

librsvgにはresize functionがありますが、廃止予定です。あなたのカイロの文脈上の

  • セットアップスケール変換行列を
  • .render_cairo()メソッド
  • 書き込みであなたのSVGを描画:図面のサイズを変更するにはカイロでscale matrixを設定

    あなたのサーフェスをPNGにする

+1

元ベクタ画像のデータの損失で、すでにラスタライズされた画像の結果を再スケーリングされます。 それは上記Luperによって答えが実装しますか? – btw0

+3

カイロ変換行列は、設定後に描画されたベクトルデータで動作します。ラスタライズされたイメージをスケーリングするのではなく、それを生成するlibrsvgによって発行されたコマンドをスケーリングします。 –

+0

よろしくお願いいたします。ありがとうございます。 – btw0

2

これは私のために働くコードです。

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()) 
関連する問題