在Python中将SVG转换为PNG

164 投票
16 回答
207334 浏览
提问于 2025-04-16 20:54

我想知道怎么把一个svg格式的文件转换成png格式的文件,使用Python来做。我把这个svg文件存储在一个叫StringIO的地方。我应该用pyCairo这个库吗?我该怎么写这段代码呢?

16 个回答

50

安装 Inkscape 后,可以通过命令行来使用它:

${INKSCAPE_PATH} -z -f ${source_svg} -w ${width} -j -e ${dest_png}

你还可以只截取特定的矩形区域,使用参数 -j,比如坐标 "0:125:451:217"

${INKSCAPE_PATH} -z -f ${source_svg} -w ${width} -j -a ${coordinates} -e ${dest_png}

如果你只想在 SVG 文件中显示一个对象,可以用参数 -i 指定你在 SVG 中设置的对象 ID。这样其他的内容就会被隐藏。

${INKSCAPE_PATH} -z -f ${source_svg} -w ${width} -i ${object} -j -a ${coordinates} -e ${dest_png}
148

这是我使用 cairosvg 做的事情:

from cairosvg import svg2png

svg_code = """
    <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
        <circle cx="12" cy="12" r="10"/>
        <line x1="12" y1="8" x2="12" y2="12"/>
        <line x1="12" y1="16" x2="12" y2="16"/>
    </svg>
"""

svg2png(bytestring=svg_code,write_to='output.png')

效果非常好!

想了解更多,可以查看这里: cairosvg 文档

74

这个答案是 "pyrsvg" - 这是一个用于 librsvg 的Python绑定。

在Ubuntu上有一个python-rsvg包可以提供这个功能。不过在谷歌上搜索它的名字效果不太好,因为它的源代码似乎包含在"gnome-python-desktop"这个Gnome项目的GIT仓库里。

我做了一个简单的“你好,世界”示例,它可以把SVG图形渲染到cairo表面,并将其写入磁盘:

import cairo
import rsvg

img = cairo.ImageSurface(cairo.FORMAT_ARGB32, 640,480)

ctx = cairo.Context(img)

## handle = rsvg.Handle(<svg filename>)
# or, for in memory SVG data:
handle= rsvg.Handle(None, str(<svg data>))

handle.render_cairo(ctx)

img.write_to_png("svg.png")

更新: 到2014年为止,Fedora Linux发行版需要的包是: gnome-python2-rsvg。上面的代码片段仍然可以正常使用。

撰写回答