下载安装
下载
访问这个地址:https://pngquant.org/,下载zip压缩包。
安装
将下载到本地的zip安装包解压之后,将里面pngquant.exe
所在的目录,添加到系统的环境变量中。
然后打开图片所在的文件夹目录,打开终端,就可以进行压缩测试了
$ pngquant a.png
对于图片a.png的压缩结果:
bash
# 源文件
a.png 19242kb
# 压缩命令
pngquant a.png
# 压缩后
a-fs8.png 625kb
# 注意,你不能使用pngquant对压缩后的a-fs8.png图片进行二次压缩,得到的新的图片,大小会跟a-fs8.png一样
相关的参数
--skip-if-larger
pngquant 有时候压缩的文件会比源文件大。这个选项会判断,如果大就取消执行,强烈建议加上。
bash
pngquant a.png --skip-if-larger
--force
强制执行,pngquant 会判断,如果有一个已经压缩的同名文件在当前文件夹,就不会执行。这个选项会覆盖原来的文件。
bash
pngquant a.png --skip-if-larger --force
--output
指定输入文件的名称, 可以指定为 jpg 格式,但是图片不会变得更小。
python
# 对a.png进行压缩,压缩出来一个新图片b.png,如果b.png存在就覆盖
pngquant a.png --skip-if-larger --force --output b.png
# 对a.png进行压缩,并且将新图片覆盖掉原图片,按需选择使用
pngquant a.png --skip-if-larger --force --output a.png
--quality
压缩后的图片质量,值范围是0~100
,值越小,图片质量越差,但压缩后的图片大小越小。
bash
# 原图片a.png 大小是1942kb
# 不带--quality压缩出来的图片大小是625kb
pngquant a.png --force --output b.png
# --quality 0压缩出来的图片大小是162kb,但图片失真严重
pngquant a.png --force --output b.png --quality 0
# --quality 10压缩出来的图片大小是446kb,但图片质量还可以
pngquant a.png --force --output b.png --quality 10
# --quality 30压缩出来的图片大小是500kb,图片质量还可以
pngquant a.png --force --output b.png --quality 30
# --quality 50压缩出来的图片大小是653kb,图片质量还可以,但压缩出来的图片反而大了
pngquant a.png --force --output b.png --quality 50
# --quality 80压缩出来的图片大小是556kb,图片质量还可以
pngquant a.png --force --output b.png --quality 80
# --quality 100压缩出来的图片大小是625kb,图片质量还可以
pngquant a.png --force --output b.png --quality 100
我试了试几个值,发现0和50不推荐,基本上用不到这个参数了。
如果非要用这个参数的话,10,30,80都还可以,我肉眼没看出来多少差别,这三个值选一个的话,我选择用30,图片质量还可以,大小也会更小点。
使用Python进行封装
win11 + python3.10
前提是pngquant软件已经成功安装到你的电脑上了。
python
import subprocess
input_flie = "a.png"
output_flie = "b.png"
# 压缩成功,创建一个新的图片
subprocess.run(f'pngquant {input_flie} --skip-if-larger --force --output {output_flie}')
# 覆盖压缩
subprocess.run(f'pngquant {input_flie} --skip-if-larger --force --output {input_flie}')
def compression_png(self, path):
""" 通过 pngquant 覆盖压缩指定文件内所有的 png 图片"""
for i in os.listdir(path):
img_file = os.path.join(path, i)
if img_file.endswith('.png'):
subprocess.run(f'pngquant {img_file} --skip-if-larger --force --output {img_file}')
compression_png(r"D:\xx")