当前位置: 首页 > 后端技术 > Python

开发一个图片压缩工具(二):使用pngquant实现图片压缩

时间:2023-03-25 23:05:39 Python

上一篇尝试使用pillow库压缩png图片,效果并不好。这次改用pngquant压缩。pngquant是用于PNG图像有损压缩的命令行实用程序和库。压缩器可显着减小文件大小(通常高达70%),同时保持完全的alpha透明度。使用alpha通道将图像转换为更高效的8位PNG格式(通常比24/32位PNG文件小60-80%)。pngquant使用的算法主要是mediancutquantization算法和K-meanscolorcorrection的改进版。所得图片中的色差肉眼几乎无法察觉。这是pngquant优化后的图片,几乎没有区别:这是pillow同样使用mediancutting和k-means得到的优化效果。云有明显的颜色过渡问题:pngquant压缩库安装pngquant提供源代码和命令line和GUI等多种形式。GUI工具目前还是比较难用,不如命令行方便,源码形式可以使用python语言通过ctype调用c源码。但是目前对这方面了解不多,以后可以使用so动态库等方法。所以,首先使用命令行形式进行PNG压缩。1、下载windows安装包或mac、linux安装包。2、在命令行输入pngquant即可使用;3、为了使用方便,可以配置环境变量(如果后面集成picom,去掉)。快速使用pngquantpngquantimagename.png一些可选参数说明:1、--skip-if-largerpngquant有时压缩后的文件会比源文件大。如果太大,该选项将判断并取消执行。强烈建议加上2,--quality0-100图像质量。如果对颜色没有特殊要求,可以减到10,但数值越小,压缩率越低,一般不需要设置。3.--force强制执行,pngquant会判断如果当前文件夹中有同名压缩文件则不执行。此选项会覆盖原始文件。4.--outputfile指定输入文件的名称。可以指定jpg格式,但图片不会变小。5.--speed执行速度使用subprocess调用pngquant命令行对应的程序:importsubprocesssubprocess.run('pngquantelephant.png')如果想获取程序运行时屏幕显示的内容,可以使用check_output方法,这里不需要。接下来使用subprocess封装对应的压缩函数:defpngquant_compress(fp,force=False,quality=None):"""压缩函数。参数:fp:文件名force:是否覆盖相同的文件名称质量:压缩质量。10-40,或10"""force_command='-f'ifforceelse''quality_command=''ifqualityandisinstance(quality,int):quality_command=f'--quality{quality}'ifqualityandisinstance(quality,str):quality_command=f'--quality{quality}'command=f'pngquant{fp}--skip-if-larger{force_command}{quality_command}'subprocess.run(command)如果__name__=="__main__":pngquant_compress('elephant.png',force=True,quality=20)