Python加Squoosh批量压缩图片

十几行的 Python 调用命令行,利用 Squoosh 实现本地批量压缩图片,内含源码与使用教程。

Squoosh 介绍

网站传送门:Squoosh 谷歌推出的在线免费图像压缩工具。

GitHub : GoogleChromeLabs/squoosh: Make images smaller using best-in-class codecs, right in the browser. (github.com)

若是只需处理一张图片,可以直接用网页版,很方便高效。

很好用,可惜在线网页没有批量压缩的选项,我一开始是十几张图片一张一张上传下载,自己想着能不能搞一个批处理功能呢?

很开心实现了,本地批量图片压缩。

环境准备

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import os
# 直接复制两个地址栏路径src和des分别填入前一个引号里面
src_folder = r''+'\\'
des_folder = r''+'\\'

files = os.listdir(src_folder)
# 这里的config是网页默认的压缩配置
config = '[\'{"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}\']'
# 支持 jpg png webp 格式
format_dic = {'jpg':"--mozjpeg",'png':"--oxipng",'webp':"--webp"}
for i in files:
src_path = src_folder + i
suffix = i.split('.')[-1]
print(src_path)
if os.path.isfile(src_path) and suffix in format_dic:
# 通过用 python 调用命令行来实现批处理
os.system("squoosh-cli " + format_dic[suffix] + " " + config + " " + src_path + " -d " + des_folder)

使用

设置好 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],起初我以为方括号[]为占位符,直接把整个替换了。

马克思主义基本原理说的没错,人的意识具有创造性。

我保留了方括号,内部填入配置,运行成功!

所以现在的配置和直接把图片拖到网页的处理效果相同。

这里面的每个坑,我都以为是死胡同,但人的主观能动性是很强的,无法解释我怎么就突然想到了解决办法,可我就是想出来了解决办法,但凡有一步想不出来,整个工程就挂了。

绝望之处,寻找希望。