Python加Squoosh批量压缩图片
十几行的 Python 调用命令行,利用 Squoosh 实现本地批量压缩图片,内含源码与使用教程。
Squoosh 介绍
网站传送门:Squoosh 谷歌推出的在线免费图像压缩工具。
若是只需处理一张图片,可以直接用网页版,很方便高效。
很好用,可惜在线网页没有批量压缩的选项,我一开始是十几张图片一张一张上传下载,自己想着能不能搞一个批处理功能呢?
很开心实现了,本地批量图片压缩。
环境准备
python 环境:我的 3.9,应该 python3 都行
由于是用 npm 安装 Squoosh,先保证安装了 Node.js
Node.js 安装配置 | 菜鸟教程 (runoob.com)
安装 Squoosh
命令行输入:
1 | npm i -g @squoosh/cli |
检查 Squooh 是否安装成功:
1 | squoosh-cli -v |
Python 源码
非常骄傲,这次代码我真的是原创。
1 | import os |
使用
设置好 python 代码 三四 行的 src 和 des 路径,直接运行即可。
进阶玩法:
将 des 路径填为与 src 相同可原地处理,此时原文件会被覆盖,无法找回,谨慎使用。
config 可以自己调整,一个好的办法是自己在网页修改为合适的参数,在网页可以实时查看效果。调整合适后,通过网页右边的 Copy npx command
来复制:
得到类似如下内容:
npx @squoosh/cli –mozjpeg ‘{“quality”:75,”baseline”:false,”arithmetic”:false,”progressive”:true,”optimize_coding”:true,”smoothing”:0,”color_space”:3,”quant_table”:3,”trellis_multipass”:false,”trellis_opt_zero”:false,”trellis_opt_table”:false,”trellis_loops”:1,”auto_subsample”:true,”chroma_subsample”:2,”separate_chroma_quality”:false,”chroma_quality”:75}’
花括号内的内容直接更换 config 中花括号的内容就更改了图片压缩配置。
需要注意的是,不同格式的文件可能处理效果不同。
默认会处理 jpg png webp 三种格式的图片,文件夹和其他类型的文件会被忽略,处理完成后还按原格式输出。很多情况下,将 png 改为 jpg 格式压缩输出会更小,把 format_dic
中 'png':"--oxipng"
改为'png':"--mozjpeg"
即可实现将 png 图片压缩为 jpg 图片。
踩过的坑
一开始没有自己配置 config,使用了它提供的 --auto
选项,压缩率暂且不提(事实上也不好),图片大的话(四五兆),会直接报错退出。
我想了一下,本地压缩会报错,在线压缩秒出结果。我初步猜想是自己电脑上 CPU 算力有限,内存占满了,而网页的那端可能会有很大的处理器集群,所以秒出。
我都已经打算放弃本地处理了,寻求用 python 提交图片到网页处理,再取回结果的在线处理方法。可惜我不会用 python 提交图片,更不会取回结果,对网页的操作知道的很有限。
万籁俱灰之际,我就自己在网页上玩,找到了一个 copy 指令的地方,拿到了网页默认压缩图片的配置。虽然是 npx 指令,我以敏锐的洞察力观察到后面的一大堆东西就是配置。
拿到配置,我直接把它替换了 --auto
,不妙,运行错误。
命令行的 README.md 中,给出指令形式为 --mozjpeg [config]
,起初我以为方括号[]
为占位符,直接把整个替换了。
马克思主义基本原理说的没错,人的意识具有创造性。
我保留了方括号,内部填入配置,运行成功!
所以现在的配置和直接把图片拖到网页的处理效果相同。
这里面的每个坑,我都以为是死胡同,但人的主观能动性是很强的,无法解释我怎么就突然想到了解决办法,可我就是想出来了解决办法,但凡有一步想不出来,整个工程就挂了。
绝望之处,寻找希望。