XiaO

SVG 图片批量压缩

XiaO / 2020-06-12


SVG (Scalable Vector Graphics) 可缩放矢量图形是一种基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式。

SVG 图片特点

SVGO 图片压缩

# 使用 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 的其他软件,或为网页版本,或为图形界面应用等:

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/ # 完成后,打开该文件夹

关于 shell 中的变量参数传递

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 查看的文件夹大小,为什么不一致呢?