如何在Python中将SVG转换为PNG或JPEG?

How to convert SVG to PNG or JPEG in Python?

我正在使用svgwrite并生成svg文件,如何将它们转换为PNG或JPEG?


为了将svg转换为png,我可以想到2种方法:

1。
这是可以满足您需求的lib:https://cairosvg.org/documentation/

1
$ pip3 install cairosvg

python3代码:

1
cairosvg.svg2png(url="/path/to/input.svg", write_to="/tmp/output.png")

在Linux(Debian 9+和ubuntu 18+)和MacOS上使用了它。对于大约1MB svg的大文件,它可以正常工作。例如:世界地图。库也允许导出pdf文件。

提示:cairosvg可按比例放大png输出图像,因为使用矢量图形svg :)后,默认大小看起来模糊。我无法使用DPI选项。

2。
还有另一种方法,可以通过使用浏览器打开svg文件并通过Firefox或其他浏览器使用Selenium Webdriver来截屏来完成。您可以将屏幕截图另存为png。

可以使用枕头将png转换为jpeg:使用枕头将png转换为jpeg


pyvips支持SVG加载。它是免费,快速,几乎不需要内存的,并且可以在macOS,Windows和Linux上运行。

您可以像这样使用它:

1
2
3
4
import pyvips

image = pyvips.Image.new_from_file("something.svg", dpi=300)
image.write_to_file("x.png")

默认DPI为72,可能会有点低,但是您可以设置任何您喜欢的DPI。您可以用明显的方式来写JPG。

您也可以像这样按像素尺寸加载:

1
2
3
4
import pyvips

image = pyvips.Image.thumbnail("something.svg", 200, height=300)
image.write_to_file("x.png")

这将使SVG适应200 x 300像素的框。该文档介绍了所有选项。

pyvips SVG加载程序具有一些不错的属性:

  • 它使用librsvg进行实际渲染,因此PNG将具有高质量的抗锯齿边缘。
  • 它比像ImageMagick这样的系统要快得多,而ImageMagick只是简单地将其渲染出来以进行渲染。
  • 它支持渐进式渲染。大图像(每侧超过几千个像素)将按部分进行渲染,即使对于非常大的图像,也可以控制内存使用。
  • 它支持流传输,因此您可以将SVG直接渲染到巨大的Deep Zoom金字塔(例如),而无需任何中间存储。
  • 它支持来自存储区,字符串和管道以及文件的输入。

我看了几种方法,包括cairo(在Windows上无法运行),svglib + reportlab(无法更改dpi),甚至是inkscape(从命令行)。

最后,这是我发现的最佳方法。我在python 3.7上进行了测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def convert(method, svg_file, png_file, resolution = 72):
    from wand.api import library
    import wand.color
    import wand.image

    with open(svg_file,"r") as svg_file:
        with wand.image.Image() as image:
            with wand.color.Color('transparent') as background_color:
                library.MagickSetBackgroundColor(image.wand,
                                                 background_color.resource)
            svg_blob = svg_file.read().encode('utf-8')
            image.read(blob=svg_blob, resolution = resolution)
            png_image = image.make_blob("png32")

    with open(png_file,"wb") as out:
        out.write(png_image)

我必须先安装wand软件包(使用pip),然后再安装ImageMagick for Windows(http://docs.wand-py.org/en/latest/guide/install.html#install-imagemagick-on-windows)。