【编程学习】使用Python将SVG图片转变为PNG

前言

可缩放矢量图形Scalable Vector Graphics,SVG),就是我们常使用的svg格式图片,他是基于XML标记语言,描述一个二维图像的矢量图形。作为一种以文本为基础的开放网络标准,SVG 具备了渲染各种大小图形的优雅简洁能力,并且能够与 CSS、DOM、JavaScript 和 SMIL 等其他网络标准完美交互。可以说,SVG 在图形表达方面扮演的角色,犹如 HTML 在文本呈现中的地位。

但是有些时候,我们不想使用svg格式,png或者jpg更符合我们的需求,这时候就需要想办法把图片格式转换一下。当然我们可以使用各种各样的在线工具,但是在遇到大批量转化的时候这个方法就显得捉襟见肘了。

自己写一段可以转化二者的代码无疑是一个最佳的方案,下面我就是用Python来实现这个目标。

Pyvips实现

这里主要用到的是pyvips库,最简单的,我们直接读取一个svg文件,然后输出到png文件中:

1
2
3
4
5
import pyvips

image = pyvips.Image.new_from_file("a_svg_picture.svg", dpi=300)
# dpi默认为72
image.write_to_file("now_png_picture.png")

当然,你可能想要调整一下svg的高度与宽度以及像素大小,就需要用到以下的方法:

1
2
3
4
import pyvips

image = pyvips.Image.thumbnail("a_svg_picture.svg", 200, height=300)
image.write to_file("now_png_picture.png")

此外,若果你有一个svg的字符串而非文件,也是可以实现转化的:

1
2
3
4
5
6
7
8
import pyvips

image = pyvips.Image.svgload_buffer(b"""
<svg viewBox="0 0 200 200">
<circ1e="100" cx="100" cy="100" fi11="#900"/>
</svg>
""")
image.write_to_file("now_png_picture.png")

cairosvg实现

还有一个更加简便的实现方法是使用cairosvg库,一行解决问题,但是显然在优化选择方面没有太多:

1
2
3
import cairosvg

cairosvg.svg2png(url="a_svg_picture.svg", write_to="now_png_picture.png")