2009-07-27 12 views
3

Beim Rastern der SVG-Datei möchte ich die Breite und Höhe für die resultierende PNG-Datei festlegen können. Mit dem folgenden Code wird nur die Zeichenfläche auf die gewünschte Breite und Höhe festgelegt. Der tatsächliche Bildinhalt mit der ursprünglichen SVG-Dateidimension wird in der oberen linken Ecke des Arbeitsbereichs (500, 600) gerendert.So passen Sie die Größe der SVG-Bilddatei mit librsvg an Python-Bindung

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") 

Was soll ich tun, um den Bildinhalt mit cairo canvas gleich groß zu machen? Ich habe versucht,

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

bekam aber

TypeError: property 'width' is not writable 

Auch Dokumente für librsvg Python scheinen Bindung extrem selten zu sein, nur einige zufällige Code-Schnipsel auf kairo Website.

Antwort

6

Es gibt eine resize function in librsvg, aber es ist veraltet.

ein scale matrix in Kairo Stellen Sie die Größe der Zeichnung zu ändern:

  • Setup eine Skala Transformations-Matrix auf Ihrem kairo Kontext
  • Ihre SVG mit dem .render_cairo() -Methode
  • Schreib zeichnen Ihre Oberfläche nach PNG
+1

Wird die bereits gerasterten Bildergebnis zu einem Datenverlust des ursprünglichen Vektor-Bild neu zu skalieren? – btw0

+3

Die Kairo-Transformationsmatrix arbeitet mit Vektordaten, die nach dem Setzen gezeichnet wurden. Sie skalieren das gerasterte Bild nicht, sondern die von librsvg ausgegebenen Befehle, die es erzeugen. –

+0

Gut zu wissen, danke. – btw0

2

Dies ist der Code, der für mich funktioniert. Es implementiert die Antwort von Luper oben:

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())