How to convert SVG to PNG or JPEG in Python?
我正在使用
为了将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)。