SVG 图片批量压缩
XiaO / 2020-06-12
SVG (Scalable Vector Graphics) 可缩放矢量图形是一种基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式。
SVG 图片特点
- SVG 图形文件可读,SVG 文件其实只是普通的文本文件,用一般的文本编辑器便可查看或修改;
- SVG 图形格式可以方便的建立文字索引,从而实现基于内容的图像搜索;
- SVG 图形格式支持多种滤镜和特殊效果;
- SVG 图形格式可以用来动态生成图形。
SVGO 图片压缩
- SVGO 是一款基于 Node.js 的 SVG 图形压缩工具,命令行软件。
# 使用 homebrew 安装
brew install svgo
# 压缩当前目录下的指定 svg 文件
svgo test.svg
# 压缩当前目录下的多个指定 svg 文件
svgo test.svg other.svg third.svg
# 压缩当前目录下的所有 svg 文件
svgo *.svg
# 压缩某个文件夹下的所有 svg 文件,并指定新的存放位置
svgo -f ../path/to/input/folder -o ../path/to/output/folder
# 压缩 data URI base64 字符,并指定生成文件
svgo -s 'data:image/svg+xml;base64,...' -o test.min.svg
另有基于 SVGO 的其他软件,或为网页版本,或为图形界面应用等:
- SVGOMG 网页版 SVG 压缩工具;
- macOS 的文件夹快速工具 OS X Folder Action;
- Image Shrinker 可同时压缩 JPG, PNG 和 SVG 的 macOS 图形界面应用;
SVGCleaner 一款追求压缩质量与效率的软件
# 使用 homebrew 安装命令行软件
brew install svgcleaner
svgcleaner input.svg out.svg #
# 使用 homebrew 安装其图形界面软件
brew cask install svgo
Scour 是一款基于 python 的 svg 压缩软件
# 使用 homebrew 安装命令行软件
brew install scour
scour -i input.svg -o output.svg # 压缩当前路径下的某个图片,软件本身无法对文件夹进行操作,即批量处理需要借助其他方法
利用 Automator 创建快捷服务进行批量处理:
Automator -> Quick Action -> Actions -> Run Shell Script
在 Shell Script ,设置输入参数为自变量,并执行如下代码:
export PATH=/usr/local/bin:$PATH # 将软件路径加入到 PATH 变量
mkdir ~/ScourCompressedImg # 在根目录创建 ScourCompressedImg 文件夹
for f in "$@"
do
if [ ${f##*.} = "svg" ] # 判断需处理的文件类型是 svg 图片
then
file=${f##*/} # 提取原文件,包含名字和后缀,赋值给变量 file
file_name=${file%.*} # 提取原文件名字,赋值给变量 file_name
scour -i $f -o ~/ScourCompressedImg/$file_name.svg # 使用 scour 压缩文件后,放入 ScourCompressedImg 文件夹中
fi
done
open ~/ScourCompressedImg/ # 完成后,打开该文件夹
file_name="abc" # 定义变量时,变量名不加美元符号($),变量名和等号之间不能有空格。除了显式地直接赋值,还可以用语句给变量赋值。
$file_name # 使用一个定义过的变量,只要在变量名前面加美元符号即可
${file_name} # 变量名外面的花括号,加不加都行,加花括号是为了帮助解释器识别变量的边界
echo "This file is "$file_name" !" # 双引号拼接字符串
echo "How to use the file, ${file_name} !" # 双引号拼接字符串,双引号里可以有变量
ehco 'hello, '$file_name' !' 单引号可成对出现,作为字符串拼接使用
$@ # 使用时加引号,并在引号中返回每个参数。如 "$@" ,用「"」括起来,即以"$1" "$2" … "$n" 的形式输出所有参数。
软件的默认压缩率比较
由包含文字和图片的中英 pdf 文件通过 pdf2svg 转换而来的 svg 文件夹,原始大小为 79.8 M。通过不同的压缩软件压缩后的体积比较,所示如下:
% du -hs * | sort -nr
76M OriginalFiles
62M Scour
57M SVGCleaner
39M SVGO
39M Image Shrinker
语法:在 shell 中查看当前文件夹下的文件和文件夹的大小
du [options] [files| directories] # disk usage occupied by files or directories
-k Measure usage in kilobytes.
-m Measure usage in megabytes.
-g Measure usage in gigabytes.
-h Print in human-readable units.
-s Print only the total size.
-L Follow symbolic links and measure the files they point to.
du myfile myfile2 # 直接读取两个文件的大小
采用各软件的默认设置直接压缩图片的结果来看,SVGO 的压缩比率最大,SVGCleaner 次之,Scour 压缩率最低。这可能与不同软件所采用的默认路径座标精度等设置以及各自的算法不同所致。而基于 svgo 的软件其压缩率是相同的。
另外,就文件处理时长来看,SVGO 和 SVGCleaner 的速度都不错,明显比 Scour 来得快得多。
通过 ⌘ + i
查看的文件夹大小所示如下:
这里有有一个意思的问题,shell 中查到的文件夹大小和通过 ⌘ + i
查看的文件夹大小,为什么不一致呢?