使用 python 压缩 png 图片,高达 80% 压缩率,肉眼无差异(一):为什么不用 pillow库.md
在网上有很多使用 python 的 pillow 库进行图片压缩的教程,使用简单,但是压缩效果存在明显的色彩不自然,这是因为 pillow 库采取的压缩算法没有优化的问题。
这个系列实现一款简单的压缩工具,使用 pngquant 有损压缩,压缩率高达 80%, 而且压缩后的图片没有明显差异。
系列文章:
1,使用 python 压缩 png 图片,高达 80% 压缩率,肉眼无差异(一):为什么不用 pillow库.md
2,使用 python 压缩 png 图片,高达 80% 压缩率,肉眼无差异(二):使用 pngquant 实现图片压缩
3,使用 python 压缩 png 图片,高达 80% 压缩率,肉眼无差异(三):使用 click 库实现命令行
4,使用 python 压缩 png 图片,高达 80% 压缩率,肉眼无差异(四):使用 requests 库上传
开发目的
我经常使用图片。公众号文章发文也好,还是生活中要使用素材。图片是一种比文字更加直观的载体。
但是图片更加占用带宽,很多软件都对图片有大小限制。图片太大也会影响加载速度。
我试过几款图片压缩工具,比如 tinypng 和 tinyjpg 非常好用,体验也非常棒。 但是它存在几个局限的地方:
- 1, 每次不能超过 20 张图片,因为 tinypng 是一个 web 网站,一次上传太多势必影响 速度和服务器压力;
- 2,不能控制压缩比例,这一点 compressjpeg.com 做的很好,可以对每一张图片进行控制
- 3,写文章的时候我 markdown 用得非常多,所以我希望在压缩的时候顺便上传到图床。
所以希望自己能做一款简单好用的图片工具,顺便定制一些自己常用的功能。
初步设想
我的初步设想是这样的:
1, 先通过命令行的形式来使用,非常方便,后面如果有需求再写界面。
picom 图片名称.jpg
这条命令可以对图片进行智能压缩。格式为原来的格式,生成的新图片名字为 图片名称_picom.jpg
2,指定新文件名
picom name.jpg -o new_name.png
图片的格式也将根据新的文件名称跟着变化
3,只指定格式
picom name.jpg --format png
图片指定为新的格式,但是文件名还是默认的。
4,裁剪大小
picom name.jpg --size normal
图片将被裁剪成正常大小,可以设置几档常用的
5,裁剪指定具体大小
picom name.jpg --size 920*520
6, 上传到图床
picom name.jpg --upload
上传到图床以后,返回图床地址。图床的地址用什么形式保存还在思考。
可能涉及的知识和库
- click 命令行工具
- subprocess 子进程管理工具
- pillow 库使用
- pngquant (一个png图片有损压缩)
- mozjpeg
- optipng (png 无损压缩)
- python 如何调用 c 代码
- requests 库和 aiohttp / aiofile 库的使用
尝试使用 pillow 库进行图片压缩
pillow 是 python 处理图片的一个非常厉害的库 , 带有图片压缩的功能。
我先后尝试使用 pillow 的以下 API 对图片进行压缩,得到的结果不是很好。
- save(quality=50)
- save(optimize=True)
- quantize()
- convert("RGB")
1,quality 参数
save 方法当中的 quality 参数只适合用在 jpg 格式上,通常 80 左右的质量不会有明显的感觉。 用在 png 格式上无效,但是也不报错。
2,optimize 参数
optimize 参数直接压缩没有明显效果。
3,quantize 方法
quantize 是主要用到的压缩优化函数,在 png 格式压缩上,能减少 70% 左右的空间,但是颜色差异明显。
image.png
这是压缩后效果对比:
4, convert 方法 通过把 png的RGBA 格式转化成 RGB 格式,可以减少大约 20% 的大小
5,PNG 以 jpg 格式保存
先通过 convert 方法转成 RGB 格式,然后另存为 jpg 格式,图片效果没有明显减弱,但是大小迅速减少。
结论
pillow 目前不太适合做 PNG 图片压缩处理,jpg 可以作为备选。 pillow 的主要应用场景可以用在灰度转化,尺寸控制方面,这些功能等把核心的压缩问题解决以后再加。
参考资料
- tinypng, pngquant和pillow压缩图片
- Crunch压缩
- Imagine:一个使用了pngquant 和 mozjpeg 的工具
- optipng:一个无损压缩库,缩小一半左右
- pillow 参考教程
请使用手机"扫一扫"x
作者:九柄
工作:软件测试工程师
领资料或者技术交流务必备注博客园
欢迎点赞和三连。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?