关于 Squoosh
Squoosh 是谷歌发布的一款开源的图片在线压缩服务(伪),虽然需要用浏览器打开,但其实是一个整合了许多命令行工具的前端界面,调用的是本地的计算资源,所以只要打开过一次 Squoosh ,之后都会秒开,并且离线使用。
优点
可以实现图片格式转换、图片压缩等操作,提供丰富的图片格式和压缩等级,可以实现几乎无损(肉眼难以分辨)的压缩,并且压缩效果非常好,比 TinyPNG 的压缩比例大得多,这也是我放弃 TinyPNG 选择 Squoosh 的原因。
缺点
无法批量处理图片,也没有提供 API,相比之下,TinyPNG 的 API 就显得方便很多。
不过,就像前面说的,Squoosh 实际上是整合了本地的命令行工具,调用的本地资源,所以,直接在命令行中使用 MozJPEG 之类的压缩方法可能更加方便。
可惜我不会。但是,我会曲线救国。
Python 调用 Selenium
思路
能力不够,资源来凑。
既然 Squoosh 是用浏览器操作的前端界面,那我就直接用代码去模拟浏览器操作。
这是 Squoosh 的主界面,Select an Image 其实是一个输入框,那我们直接用 Selenium 把本地图片的路径输入进去就行了:
输入图片路径之后就会默认压缩成 75% 质量的 MozJPEG,我觉得无论是压缩比和质量都很不错,所以就没有改,等待页面加载完成之后就直接下载:
我们可以认为出现 "..% smaller" 就算是压缩完成,这时候直接点击右边的下载按钮即可。
代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import os
driver = webdriver.Chrome()
# 列出目录下所有的图片,存在 images 这个列表中
images = os.listdir('/Users/****/Pictures/SP/')
# 我是 Mac 系统,会多出个 .DS_Store,需要删除掉
images.remove('.DS_Store')
# 处理所有图片
for i in range(len(images)):
# 构建图片路径
path = '/Users/****/Pictures/SP/' + images[i]
# 尝试处理所有图片
try:
# 打开 Squoosh
driver.get('https://squoosh.app')
# 找到输入框
input_box = driver.find_element_by_xpath('.//input[@class="_2zg9i"]')
# 输入图片路径
input_box.send_keys(path)
# 等待出现 'smaller'字样,10秒不出现则视为处理失败
locator = (By.XPATH, './/span[@class="_1eNmr _1U8bE"][last()]')
WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element(locator, 'smaller'))
# 找到下载按钮
button = driver.find_elements_by_xpath('.//a[@title="Download"]')[-1]
# 点击下载按钮
button.click()
# 输出处理失败的图片路径
except:
print('*'*30)
print('Error: '+ path +' failed!')
print('*'*30)
continue
Comments | 3 条评论
博主 英雄莫不孤独
Python + Selenium 也算是个曲线救国的办法。
不过貌似 Squoosh 支持本地 Node 调用?这个路子有没有办法曲线调用?
略懂Python,不懂Node,请教之。
博主 傲娇的小基基
@英雄莫不孤独 其实Squoosh本身就是在调用一些本地的工具。我也不太明白,所以只用了这个方法。
如果你不想用浏览器访问的话,完全可以直接用MozJPEG这些工具。
博主 skull
多谢分享! 正好用到 1000+照片需处理 统一设置宽度 压缩了90% 节省不少时间