Skip to content

下载安装

下载

访问这个地址:https://pngquant.org/,下载zip压缩包。

1832669997340557312.png

安装

将下载到本地的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一样

相关的参数

参考:https://segmentfault.com/a/1190000022478102?sort=votes

--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")