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

时间:2018-07-20 20:45:02

标签: python svg png jpeg svgwrite

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

4 个答案:

答案 0 :(得分:3)

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

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

$ pip3 install cairosvg

python3代码:

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。

一个人可以使用Pillow将png转换为jpeg:Convert png to jpeg using Pillow

答案 1 :(得分:2)

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

您可以像这样使用它:

CoroutineScope

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

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

import pyvips

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

这将使SVG适应200 x 300像素的框。 docs introduce all the options

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

在 Windows 上,尝试导入 pyvips 时,您会遇到诸如 libgobject-2.0-0.dll、libvips-42.dll 等未找到的错误。要让 pyvips 在 Windows 上运行,请执行以下操作:

在代码中这样做:

import os

# The bin folder has the DLLs
os.environ['path'] += r';C:\Path\ToYour\VIPsFolder\bin'

import pyvips

image = pyvips.Image.thumbnail("test.svg", 200)
image.write_to_file("test.png")

我推荐使用 pyvips 而不是 cairosvg。从我的测试来看,它比 cairosvg 快得多,尤其是对于大型 SVG。无论如何,您需要类似于上述内容才能让 cairosvg 在 Windows 上运行。