Mac 命令行终极指南:如何批量高效压缩 PNG 图片

觉得图片太大占空间?-compression_level 9 压缩后还是没变化?本文教你如何利用 Mac 命令行工具 pngquant 配合自动化脚本,实现一键批量“智能有损压缩”,在保证画质的前提下让图片瘦身 70%!

Share
Mac 命令行终极指南:如何批量高效压缩 PNG 图片

在日常开发、网页设计或写博客时,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 脚本可以帮你实现以下功能:

  1. 自动批量处理:遍历当前目录下的所有 PNG 图片。
  2. 智能重命名:压缩后的文件会自动在原文件名前加上下划线 _(例如:logo.png -> _logo.png)。
  3. 安全跳过
  • 如果带下划线的目标文件已经存在,自动跳过。
  • 如果文件本身已经是以 _ 开头的(说明是已经压缩过的),也会自动跳过,防止无限重复处理。

脚本代码

你可以将以下代码保存为 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 脚本文件(推荐长期使用)

  1. 在图片所在文件夹内创建一个新文件,命名为 compress.sh,将上面的代码粘贴进去。
  2. 打开终端,定位到该目录,赋予脚本执行权限:
chmod +x compress.sh

  1. 运行脚本:
./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:非常智能的开关。如果图片本身已经被压缩得很极致,再次压缩可能会导致体积反而变大。这个参数确保“只有变小才保存”。

通过这套工作流,你可以轻松管理博客素材、减少代码库体积,再也不用一张张去拖网页端压缩了!