使用CairoSVG批量将SVG格式图片转换为PNG
目标SVG:Scalable Vector Graphics。是矢量格式的图片。我现在需要工具来帮我批量将SVG格式的图片转换为PNG。查阅资料发现可以用CairoSVG做这件事。本篇的目标是在官方文档的指导下尝试其功能,并完成批量转换的任务。CairoSVG是什么CairoSVG is a SVG 1.1 to PNG, PDF, PS and SVG converter. It provide
目标
SVG:Scalable Vector Graphics。是矢量格式的图片。
我现在需要工具来帮我批量将SVG格式的图片转换为PNG。查阅资料发现可以用CairoSVG做这件事。
本篇的目标是在官方文档的指导下尝试其功能,并完成批量转换的任务。
CairoSVG是什么
CairoSVG is a SVG 1.1 to PNG, PDF, PS and SVG converter. It provides both a command-line interface and Python 3.5+ library, for Unix-like operating systems (at least Linux and macOS) and Windows. It is a free software, distributed under LGPLv3.
CairoSVG is written in Python and based on the famous 2D graphics library called Cairo. It is tested on SVG samples coming from the W3C test suite. It also relies on tinycss2 plus cssselect2 to apply CSS, and on defusedxml to detect unsafe SVG files. Embedded raster images are handled by Pillow.
CairoSVG 是一个将 SVG1.1 转换为 PNG,PDF,PS 的转换器。它提供了命令行与Python3.5+ 的操作接口。可以在Unix类操作系统(至少Linux和macOS)和Windows操作系统上运行。它是免费的,LGPLv3许可。
CairoSVG 是由Python编写,基于著名的2D图形库——Cairo。测试的样例来自于 W3C test suite。它还依靠tinycss2和cssselect2来应用CSS,并依靠defusedxml来检测不安全的SVG文件。 嵌入式的光栅化则由Pillow处理。
安装
1. 使用Pip来安装cairosvg
(执行前需要确保pip3的执行文件在环境变量Path中)
pip3 install cairosvg
之后在python的路径中得到cairosvg.exe
2. 安装GTK+
当我安装完cairosvg后尝试用命令行执行,发现有错误提示:
我在《OSError: no library called “cairo” was found 怎么解决_不正先生的博客-CSDN博客》中找到了解决方法:
在GTK-for-Windows-Runtime-Environment-Installer里找到“gtk2-runtime-2.24.32-2020-07-15-ts-win64.exe”
下载并安装。之后可以运行。
试用A. 使用命令行
如果安装没问题,可以轻易使用命令行完成一次转换:
例如,svg图片在“D:/Temp/test.svg”,那么可以运行Cmd:
cairosvg D:/Temp/test.svg -o D:/Temp/test.png
接着就会在“D:/Temp/test.png”生成png图片。
使用cairosvg --help
可以显示额外的参数:
C:\Users\admin>cairosvg --help
usage: cairosvg [-h] [-v] [-f {pdf,png,ps,svg}] [-d DPI] [-W WIDTH] [-H HEIGHT] [-s SCALE] [-u]
[--output-width OUTPUT_WIDTH] [--output-height OUTPUT_HEIGHT] [-o OUTPUT]
input
Convert SVG files to other formats
positional arguments:
input input filename or URL
optional arguments:
-h, --help show this help message and exit
-v, --version show program's version number and exit
-f {pdf,png,ps,svg}, --format {pdf,png,ps,svg}
output format
-d DPI, --dpi DPI ratio between 1 inch and 1 pixel
-W WIDTH, --width WIDTH
width of the parent container in pixels
-H HEIGHT, --height HEIGHT
height of the parent container in pixels
-s SCALE, --scale SCALE
output scaling factor
-u, --unsafe resolve XML entities and allow very large files (WARNING: vulnerable to XXE attacks and
various DoS)
--output-width OUTPUT_WIDTH
desired output width in pixels
--output-height OUTPUT_HEIGHT
desired output height in pixels
-o OUTPUT, --output OUTPUT
output filename
官方文档也有相关介绍。
试用B. 使用Python接口
cairosvg
模块包含四个函数:
- svg2pdf
- svg2png
- svg2ps
- svg2svg
这些函数的参数可以使用下面的方式指定图片:
url
, 一个 URL 或者文件名file_obj
, 一个 file-like 对象(?)bytestring
, 一个包含SVG数据的字节流字符串
他们也可以接收可选的参数,对应于命令行中的选项:
- parent_width,
- parent_height,
- dpi,
- scale
- unsafe
如果提供了write_to
参数(文件名或者 file-like 对象),则结果将会输出到那儿,否则函数就会返回一个字节流。
例如:
import cairosvg
cairosvg.svg2png(url="D:/Temp/test.svg", write_to="D:/Temp/test2.png")
批处理脚本
使用os
模块的walk
函数来遍历所有的文件,然后调用cairosvg.svg2png
:
import cairosvg
import os
inputFolder = "D:/Temp/inputsvg" #输入的文件夹,里面有svg
outputFolder = "D:/Temp/output" #输出的文件夹,将把结果放到此文件夹中
for root, dirs, files in os.walk(inputFolder):#遍历所有的文件
for f in files:
svgFile = os.path.join(root,f) #svg文件名
if f[-3:] == "svg":#确保是svg
pngFile = outputFolder + "/" + f.replace("svg","png") #png文件名
cairosvg.svg2png(url=svgFile, write_to=pngFile)
其中inputFolder
是输入的文件夹,里面有svg。
而outputFolder
是输出的文件夹,将把结果放到此文件夹中
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)