尝试用python开发一款图片压缩工具1:尝试 pillow库
在网上有很多使用 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
尝试用python开发一款图片压缩工具1:尝试 pillow库的更多相关文章
- python 开发一款图片压缩工具(四):上传图床
上一篇使用了 pngquant 图片压缩工具进行压缩,并通过 click 命令行工具构建了 picom 包.这篇的主要功能是实现图片上传. 图片上传功能的实现 通过 pngquant 压缩图片后,得到 ...
- 开发一款图片压缩工具(三):使用 click 实现命令行
上一篇实现了图片的压缩函数.现在如果需要对图片进行压缩,可以调用实现的函数进行压缩: pngquant_compress('elephant.png', force=True, quality=20) ...
- 开发一款图片压缩工具(二):使用 pngquant 实现图片压缩
上一篇我尝试使用了 pillow 库对 png 图片进行了压缩,效果不好.这次我换用 pngquant 来压缩.pngquant 是用于 PNG 图像有损压缩的命令行实用程序和库.压缩程序会显著减小文 ...
- 分享一下怎么开发一款图片视频类App,秒拍和prisma
第一步,分解短视频App的功能 我们在秒拍官网看到如此描述: [视频拍摄及导入]支持直接拍摄及导入手机本地的视频 [照片电影]照片专属特效,轻松创作照片电影 [MV特效]10余款全新MV特效,让普通视 ...
- 尝试用 Python 写了个病毒传播模拟程序
病毒扩散仿真程序,用 python 也可以. 概述 事情是这样的,B 站 UP 主 @ele 实验室,写了一个简单的疫情传播仿真程序,告诉大家在家待着的重要性,视频相信大家都看过了,并且 UP 主也放 ...
- 利用python开发app实战
你说,我们的未来 被装进棺材,染不上尘埃 *** 我很早之前就想开发一款app玩玩,无奈对java不够熟悉,之前也没有开发app的经验,因此一直耽搁了.最近想到尝试用python开发一款app,goo ...
- 【从零学习Python】Ubuntu14.10下Python开发环境配置
1. 前言 近期在研究计算机视觉的一些算法,也刚開始接触linux,试着在ubuntu下用qt+openCV进行开发,感觉还行.可是Python作为在学术领域广为应用的高级解释性语言.其在计算机视觉的 ...
- Python开发(一):Python介绍与基础知识
Python开发(一):Python介绍与基础知识 本次内容 一:Python介绍: 二:Python是一门什么语言 三:Python:安装 四:第一个程序 “Hello world” 五:Pytho ...
- Qt+Python开发百度图片下载器
一.资源下载地址 https://www.aliyundrive.com/s/jBU2wBS8poH 本项目路径:项目->收费->百度图片下载器(可试用5分钟) 安装包直接下载地址:htt ...
随机推荐
- Serpent.AI - 游戏代理框架(Python)
Serpent.AI - 游戏代理框架(Python) Serpent.AI是一个简单而强大的新颖框架,可帮助开发人员创建游戏代理.将您拥有的任何视频游戏变成一个成熟的实验的沙箱环境,所有这些都是熟悉 ...
- 从DeepNet到HRNet,这有一份深度学习“人体姿势估计”全指南
从DeepNet到HRNet,这有一份深度学习"人体姿势估计"全指南 几十年来,人体姿态估计(Human Pose estimation)在计算机视觉界备受关注.它是理解图像和视频 ...
- .NET Core技术研究-中间件的由来和使用
我们将原有ASP.NET应用升级到ASP.NET Core的过程中,会遇到一个新的概念:中间件. 中间件是ASP.NET Core全新引入的概念.中间件是一种装配到应用管道中以处理请求和响应的软件. ...
- springboot项目启动-自动创建数据表
很多时候,我们部署一个项目的时候,需要创建大量的数据表.例如mysql,一般的方法就是通过source命令完成数据表的移植,如:source /root/test.sql.如果我们需要一个项目启动后, ...
- Js,JQuery不同方式绑定的同一事件可以同时触发,互不干扰
比如,onclick绑定,然后jquery.on("click", function(){})绑定等
- I - 动物狂想曲 HDU - 6252(差分约束)
I - 动物狂想曲 HDU - 6252 雷格西桑和路易桑是好朋友,在同一家公司工作.他们总是一起乘地铁去上班.他们的路线上有N个地铁站,编号从1到N.1站是他们的家,N站是公司. 有一天,雷格西桑起 ...
- 【Jenkins】使用 Jenkins REST API 配合清华大学镜像站更新 Jenkins 插件
自从去年用上了 Jenkins 进行 CI/CD 之后,工作效率高了不少,摸鱼的时间更多了.不过 Jenkins 好是好,但在功夫网的影响下,插件就是经常更新不成功的,就像下面这样子: 查了不少资料, ...
- 配置NTP和crontab计划任务
配置NTP网络时间客户端和设置计划任务 3.1问题 本例要求配置虚拟机server0,能够自动校对系统时间.相关信息如下: NTP服务器 ...
- MyBatis(四):SqlSession及其工厂类的作用域和生命周期
本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出1便就懂!b站搜索狂神说即可 https://space.bilibili.com/95256449?spm_id_from=333.788 ...
- sqlchemy查询的其他操作
sqlalchemy的数据查询排序 1 .正序排序:session.query(model).order_by(model.attr).all() session.query(model).order ...