Mac 命令行终极指南:如何批量高效压缩 PNG 图片
觉得图片太大占空间?-compression_level 9 压缩后还是没变化?本文教你如何利用 Mac 命令行工具 pngquant 配合自动化脚本,实现一键批量“智能有损压缩”,在保证画质的前提下让图片瘦身 70%!
在日常开发、网页设计或写博客时,PNG 图片往往因为体积过大导致加载缓慢或浪费存储空间。你可能尝试过使用 FFmpeg 的 -compression_level 9 参数,但很快会发现:压缩后文件体积几乎没有变化。
这是因为 PNG 是一种无损格式,单纯调节压缩级别只是“把衣服叠得更整齐”,并没有真正减少数据。想要实现像 TinyPNG 那样大幅度(50% - 80%)的瘦身,我们需要借助“智能有损压缩”工具。
今天就教大家如何在 Mac 上利用命令行工具 pngquant,配合一个自动化脚本,一键批量压缩图片,并且实现智能重命名与自动跳过功能。
为什么选择 pngquant?
在众多的命令行工具中(如 Oxipng、OptiPNG、FFmpeg),pngquant 是有损压缩领域的“天花板”。它通过将 24 位/32 位的真彩色图片转换为 8 位的索引色,能够砍掉 70% 左右的体积,同时利用高级抖动算法,让肉眼几乎看不出画质损耗。
准备工作:安装 pngquant
在 Mac 上,我们通常使用包管理器 Homebrew 来安装。如果你还没有安装过它,可以打开终端(Terminal)执行以下命令:
brew install pngquant
终极自动化脚本
如果有很多图片需要处理,手动输入命令显然太低效。下面这个 Bash 脚本可以帮你实现以下功能:
- 自动批量处理:遍历当前目录下的所有 PNG 图片。
- 智能重命名:压缩后的文件会自动在原文件名前加上下划线
_(例如:logo.png->_logo.png)。 - 安全跳过:
- 如果带下划线的目标文件已经存在,自动跳过。
- 如果文件本身已经是以
_开头的(说明是已经压缩过的),也会自动跳过,防止无限重复处理。
脚本代码
你可以将以下代码保存为 compress_png.sh:
#!/bin/bash
# 遍历当前目录下所有 .png 文件(不区分大小写)
for file in *.[pP][nN][gG]; do
# 1. 确保文件存在,防止目录为空时报错
[ -e "$file" ] || continue
# 2. 如果文件本身就是以 _ 开头的,直接跳过
if [[ "$file" == _* ]]; then
continue
fi
# 定义输出文件名
output="_$file"
# 3. 如果带下划线的目标文件已经存在,跳过
if [ -f "$output" ]; then
echo "跳过: $output 已经存在"
continue
fi
echo "正在处理: $file -> $output"
# 执行压缩
# --quality=65-80: 质量区间,平衡体积与画质
# --skip-if-larger: 如果压缩后反而变大,则不保存原样输出
pngquant --quality=65-80 --skip-if-larger --output "$output" "$file"
done
echo "--- 批量处理完成 ---"
如何使用这个脚本?
方法 A:保存为 .sh 脚本文件(推荐长期使用)
- 在图片所在文件夹内创建一个新文件,命名为
compress.sh,将上面的代码粘贴进去。 - 打开终端,定位到该目录,赋予脚本执行权限:
chmod +x compress.sh
- 运行脚本:
./compress.sh
方法 B:终端一行命令(临时应急)
如果你不想创建脚本文件,可以直接复制下面这一行“压缩版”命令,粘贴到目标文件夹的终端里直接回车:
for f in *.[pP][nN][gG]; do [[ "$f" == _* ]] && continue; out="_$f"; [ -f "$out" ] && continue; echo "Processing $f..."; pngquant --quality=65-80 --skip-if-larger --output "$out" "$f"; done
核心参数解析
在脚本中,我们使用了两个非常关键的 pngquant 参数:
--quality=65-80:这是业界公认平衡度最好的色彩区间。既能大幅压缩体积,又能保证在 Retina 视网膜屏幕上看起来依然清晰锐利。--skip-if-larger:非常智能的开关。如果图片本身已经被压缩得很极致,再次压缩可能会导致体积反而变大。这个参数确保“只有变小才保存”。
通过这套工作流,你可以轻松管理博客素材、减少代码库体积,再也不用一张张去拖网页端压缩了!