python中的服务器端SVG到PNG(或其他一些图像格式)

时间:2010-05-28 20:44:38

标签: python png svg

目前我正在使用rsvg来加载svg(来自字符串,而不是来自文件)并绘制到cairo。谁知道更好的方法?我在我的应用程序中的其他位置使用PIL,但我不知道如何使用PIL执行此操作。

4 个答案:

答案 0 :(得分:12)

以下是我目前的情况:

import cairo
import rsvg

def convert(data, ofile, maxwidth=0, maxheight=0):

    svg = rsvg.Handle(data=data)

    x = width = svg.props.width
    y = height = svg.props.height
    print "actual dims are " + str((width, height))
    print "converting to " + str((maxwidth, maxheight))

    yscale = xscale = 1

    if (maxheight != 0 and width > maxwidth) or (maxheight != 0 and height > maxheight):
        x = maxwidth
        y = float(maxwidth)/float(width) * height
        print "first resize: " + str((x, y))
        if y > maxheight:
            y = maxheight
            x = float(maxheight)/float(height) * width
            print "second resize: " + str((x, y))
        xscale = float(x)/svg.props.width
        yscale = float(y)/svg.props.height

    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, x, y)
    context = cairo.Context(surface)
    context.scale(xscale, yscale)
    svg.render_cairo(context)
    surface.write_to_png(ofile)

答案 1 :(得分:3)

imagemagic怎么样? - http://www.imagemagick.org/script/magick-vector-graphics.php它可以读/写stdin / stdout,因此即使你不想使用文件也可以将它与你的应用程序集成

答案 2 :(得分:2)

我安装了inkscape,所以我只是使用inkscape -f file.svg -e file.png

将过程转换为inkscape命令

使用此代码:

import subprocess
inkscape_dir=r"C:\Program Files (x86)\Inkscape"
assert os.path.isdir(inkscape_dir)
os.chdir(inkscape_dir)
subprocess.Popen(['inkscape.exe',"-f",fname,"-e",fname_png])

我在Windows 7上,并且在我切换到inkscape目录之前得到了Windows 5错误[拒绝访问](或类似的东西)

答案 3 :(得分:2)

你也可以使用PhantomJS(见http://phantomjs.org/screen-capture.html

来自shell:

phantomjs rasterize.js http://ariya.github.com/svg/tiger.svg tiger.png

或者使用selenium的python:

from selenium import webdriver  
driver = webdriver.PhantomJS()
driver.set_window_size(1024, 768) 
driver.get('http://ariya.github.com/svg/tiger.svg')
driver.save_screenshot('tiger.png')