如何在Python中将SVG转换为PNG或JPEG?
我正在使用如何在Python中将SVG转换为PNG或JPEG?,python,svg,png,jpeg,svgwrite,Python,Svg,Png,Jpeg,Svgwrite,我正在使用svgwrite生成svg文件,如何将它们转换为PNG或JPEG?要将svg转换为PNG,我可以想到两种方法: 一,。 以下是可以满足您需要的lib: python3代码: cairosvg.svg2png(url="/path/to/input.svg", write_to="/tmp/output.png") 已经在linux(Debian9+和Ubuntu18+)和MacOS上使用过。它的工作原理与1MB左右svg的大文件相同。示例:世界地图。Lib还允许导出pdf文件 提示:
svgwrite
生成svg文件,如何将它们转换为PNG或JPEG?要将svg转换为PNG,我可以想到两种方法:
一,。
以下是可以满足您需要的lib:
python3代码:
cairosvg.svg2png(url="/path/to/input.svg", write_to="/tmp/output.png")
已经在linux(Debian9+和Ubuntu18+)和MacOS上使用过。它的工作原理与1MB左右svg的大文件相同。示例:世界地图。Lib还允许导出pdf文件
提示:cairosvg提供png输出图像的放大,因为使用矢量图形svg:)后,默认大小看起来很模糊。我无法让DPI选项为我工作
二,。
还有另一种方法可以做到这一点,即使用浏览器打开svg文件,并在Firefox或其他浏览器上使用SeleniumWebDriver拍摄屏幕截图。您可以将屏幕截图另存为png
可以使用Pillow将png转换为jpeg:我查看了几种方法,包括cairo(我无法在Windows上使用)、svglib+reportlab(dpi无法更改),甚至inkscape(从命令行) 最后,这是我找到的最好的方法。我在Python3.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()。支持SVG加载。它是免费的、快速的,需要很少的内存,并且可以在macOS、Windows和Linux上运行
您可以这样使用它:
导入pyvips
image=pyvips.image.new\u from\u文件(“something.svg”,dpi=300)
image.write_到_文件(“x.png”)
默认DPI为72,可能有点低,但您可以设置任何喜欢的DPI。你可以用一种显而易见的方式写JPG
您还可以按需要的像素尺寸加载,如下所示:
导入pyvips
image=pyvips.image.缩略图(“something.svg”,200,高度=300)
image.write_到_文件(“x.png”)
这将使SVG适合200 x 300像素的框。这个
pyvips SVG加载器有一些很好的特性:
- 它使用librsvg进行实际渲染,因此PNG将具有高质量的抗锯齿边
- 它比像ImageMagick这样的系统要快得多,后者只需向inkscape提供渲染
- 它支持渐进式渲染。大图像(每面超过几千像素)以分区方式渲染,即使对于非常大的图像,也可以控制内存使用
- 它支持流,因此您可以直接将SVG渲染到一个巨大的深度缩放金字塔(例如),而不需要任何中间存储
- 它支持来自内存区域、字符串和管道以及文件的输入
导入pyvips
x=pyvips.Image.svgload_缓冲区(b”“”
""")
x、 将_写入_文件(“x.png”)
在Windows上,在尝试导入PyVIP时,会出现诸如libgobject-2.0-0.dll、libvips-42.dll等错误。要使PyVIP在Windows上工作,请执行以下操作:
- 从下载Windows的zip文件并解压缩到文件夹
- pip安装pyvips
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上工作,您需要使用类似于上述内容的工具。我在SO中没有发现类似的问题。投了赞成票。你的问题似乎有一个答案:但是。。。这是另一种解放,对吗?但也许你需要它。@qräbnö既然svgwrite似乎不能处理svg到png的转换,那么。。。是的,你需要另一个图书馆。同样问题的另一个例子也可以在这里找到:
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")