目标

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 转换为 PNGPDFPS 的转换器。它提供了命令行Python3.5+ 的操作接口。可以在Unix类操作系统(至少LinuxmacOS)和Windows操作系统上运行。它是免费的,LGPLv3许可。
CairoSVG 是由Python编写,基于著名的2D图形库——Cairo。测试的样例来自于 W3C test suite。它还依靠tinycss2cssselect2来应用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是输出的文件夹,将把结果放到此文件夹中

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐