Donn wrote:
Have a look at Cairo (python-cairo) in conjunction with librsvg (python-rsvg) -- that'll fix you up. You can go from an SVG to a PNG/array and thence into PIL if you need to.

Thanks for the tip. Got it work, although it was a bit tricky, as resizing doesn't seem to be supported by python-rsvg and cairo.ImageSurface.create_from_png doesn't allow StringIO or TemporaryFile for some reason (got Memory Error). So the code, if someone else needs it or someone can improve it:

def open_svg_as_image(fn, width, height):
    tmpfd, tmppath = tempfile.mkstemp(".png")
    tmpfile = os.fdopen(tmpfd,'w')

    file = StringIO.StringIO()
    svgsurface = cairo.SVGSurface (file, width, height)
    svgctx = cairo.Context(svgsurface)
    svg = rsvg.Handle(file=fn)
    svgwidth = svg.get_property('width')
    svgheight = svg.get_property('height')
    svgctx.scale(width/float(svgwidth),height/float(svgheight))
    svg.render_cairo(svgctx)

    svgsurface.write_to_png(tmpfile)
    tmpfile.close()
    svgsurface.finish()

    tmpfile = open(tmppath, 'r')
    imgsurface = cairo.ImageSurface.create_from_png(tmpfile)
    imgwidth = imgsurface.get_width()
    imgheight = imgsurface.get_height()

    data = imgsurface.get_data()

    im = Image.frombuffer("RGBA",(imgwidth, imgheight),
                        data ,"raw","RGBA",0,1)
    os.remove(tmppath)
    return im

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to