几张图可以上传,
整个工程不能靠手点。
包体积治理需要一次处理几万张 PNG,后面还会不断新增资源。 在线工具效果不错,但上传、额度、隐私和重复执行都会进入主链路。
先查它公开讲了什么,再找同类开源实现和可复用参数。
组合工具、补脚本、加缓存、写回退,再用测试和真实素材验证。
它采用同类公开技术路线,并补齐了工程里真正缺失的部分。
省大头的是颜色,
省小头的是编码。
TinyPNG 公开说明会合并相近颜色、转成更小的索引色,并清理元数据。 `pngquant` 作者也把 TinyPNG 等服务列为同类量化方案的应用。
真彩色、透明通道、原始编码和元数据。
改进的颜色量化、感知权重、自适应抖动和 alpha / gamma 处理。
有损 · 主要收益重新选择滤波方式、重压编码并清理非必要元数据。
无损 · 继续收紧先过门禁,再决定覆盖还是回退。
公开对比表明,默认参数下 TinyPNG 往往更小;调整 `pngquant` 的质量参数后, 本地方案可以追平或反超测试集。素材、参数和验证方式共同决定结果。
每张图片都要单独决定,
覆盖还是回退。
切换下面四类素材,可以看到参数、门禁和最终动作怎样变化。 Skill 既要压得小,也要知道什么时候应该停手。
量化颜色,再做无损收尾
普通图使用 65-85 质量区间,主要体积由 pngquant 降下来。
- 参数
- quality 65-85 · speed 1 · dithering 1.0
- 门禁
- 解码 · 尺寸 · alpha · PSNR / SSIM / MAE · 更小
- 动作
- 通过后原地覆盖,最终 hash 写入缓存
覆盖原图,缓存最终文件内容。
压缩算法公开,
可靠地反复运行并不天然成立。
工程化首先要补齐边界:哪些目录不能碰,哪些图片不能压, 哪些结果不能覆盖,以及下一次怎么只处理新增和变化。
压过的图片不再压第二次
缓存记录最终文件内容。新增或改动的图片继续处理,未变化的文件直接跳过。
候选图没有更小,就保留原图
小 icon 本来就很紧,强行量化可能变大。结果必须比原图小,才允许覆盖。
解码、尺寸和 alpha 先过关
候选图打不开、宽高变化、透明通道丢失或动画帧数变化,立即回退。
白底黑底都看,避免透明图漏判
PSNR、SSIM、MAE 和 alpha MAE 同时检查,只拦明显坏图,不替代最终肉眼验收。
APNG 不进入有损量化
检测到 acTL 动画块直接跳过,避免一张动图被压成静态首帧。
几万张资源可以持续跑
目录递归和多进程并行补上网页工具缺少的批处理能力。
先拿自己的公开素材跑,
再谈“效果怎么样”。
下面是本网站公开目录的一次 `--dry-run`。它只证明这条流水线在这批素材上的真实输出, 不代表所有项目都能得到同样比例。
./compress.sh public --dry-run -j 4 运行前后对 23 张原图做 SHA-256 对照,确认 dry-run 没有改动任何文件。
适合什么
- App 包体积治理中的 PNG 批量压缩
- 一次需要处理几万张图片的工程
- 图片不能上传到第三方服务的本地处理场景
- 需要持续处理新增资源,并避免重复有损压缩的团队工作流
它只接收一个目录,不读取 Xcode 工程、Scheme、Bundle ID 或业务源码。默认跳过依赖目录和构建产物,因此也能用于其他 App 工程或独立图片目录。
安装
git clone https://github.com/Job-Yang/jobbyang-ai-skills.git
cp -R jobbyang-ai-skills/skills/png-compress-skill ~/.claude/skills/png-compress-skill
装好后,直接告诉 Agent:
帮我压一下这个 App 工程里的 PNG:/path/to/MyApp
建议先用 --dry-run 估算收益。正式执行会原地替换通过门禁的 PNG,并在目标目录写入内容 hash 缓存。
边界
这是有损压缩。自动门禁可以拦住无法解码、尺寸变化、alpha 丢失和明显劣化,但不能替代全部主观视觉验收。
AppIcon、启动图、大面积渐变、半透明阴影,以及带 ICC 或 Display P3 色彩配置的素材,仍应在真实设备上抽检。APNG 会直接跳过,避免动画被压成单帧。
这套实现沿用 TinyPNG 公开描述中的同类技术路线,不声称复刻它的未公开算法。不同素材差异很大,最终效果应以项目自己的 A/B 结果为准。