本文原创并首发于公众号 [Python 猫] ,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/5hpFDgjCpfb0O1Jg-ycACw
熟悉 “ Python 猫” 的读者应该知道,猫哥我发布的所有文章都使用了极具特色的配图——原创文章使用猫图,转载文章使用狗图,极少例外。
这几天,我在用 Github page + hexo 搭建个人网站,为了延续风格,就想把配图与文章一起迁移过去。这时候就出现了一个难题:我所用的图片都是高清大图,放到网站上就严重拖慢了加载速度。因此,需要先把图片压缩,再上传。
我把需求概括如下:
按着这几条线索,我搜索“批量压缩图片”、“图片压缩工具“、”批量处理图片“......
一开始的想法是找轻量级的图片压缩工具,简单处理一下就好。然而不知是搜索的姿势不对,还是筛选过滤信息的姿势不对,结果都差强人气。
查找到的工具有本地与在线两类,可试验后都不太理想:有的软件下载后才发现是付费的,有的在使用时直接导致程序卡死,有的压缩率不够需要多次压缩,有的要求原始图片大小不能超过 5 M,有的要求批量处理数量不超过 20 张,有的不支持批量压缩......群内小伙伴还帮忙推荐了“ PS+批处理”、acdsee、甚至手机应用 snapseed,都不合我意。
花了不少时间后,偶然看到有文章写用 Python 来压缩图片。一文惊醒梦中人,我怎么没想到呢?
先看看别人是怎么做的。这篇《如何用 Python 智能批量压缩图片?》(https://zhuanlan.zhihu.com/p/32246003)文章中介绍了使用 PIL 库的 Image 模块来压缩图片的方法,主要通过调节图片长宽数值的方式。
PIL 是个强大的图片处理库,但只支持 Python 2,而且早已停止更新。有开发者在它基础上改良并维护了 Pillow,支持 Python 3。之前有所耳闻,没用过。于是猫哥查了几篇教程和文档。读后发现它压缩图片的方法主要是等比例缩放、裁剪以及改变格式等,并非我所要的。
还看到一篇《如何在无损的情况下让图片变的更小》(https://juejin.im/post/5959fbe0f265da6c2518d740)文章,它介绍了 Yelp (美国最大点评网站)的三种优化图片的策略:Pillow、动态调优、更换编码器。有些方法很高大上,应该是业界先进经验了,但它希望保证图片无损,所有方法加起来才可以使图片大小平均减少 30%,因此并不满足我的要求。另外它引申介绍了几种方法,可是需要花费时间去研究,我也放弃了。
最后,终于找到了一种非常便捷,又十分满足的方案,下面开始进入正题了。(不要嫌我啰嗦,探索的过程也很有趣)(嘘,实际上是因为下面要介绍的方法太简单,才区区几行代码,我实在忍不住强行加戏......)
----------------小心翼翼的分割线---------------
Tinypng 网站提供在线图片压缩服务,是所有图片压缩工具中最好用的之一,但它有所限制:批量最多处理 20 张,且每张大小不允许超过 5 M。
这个网站非常良心,开放了免费的 API,API 取消了每张大小的限制,只限定每个月处理 500 张图片。这对我来说,已经足足有余了。
下面介绍怎么使用它。第一步是在它网站上注册,获得专属的 API_KEY。使用的是邮箱注册,很简单。
然后是安装 package:
pip install --upgrade tinify
接着是处理图片:
import tinify
import os
tinify.key = '此处填入你的 key'
path = "C:\\Users\\yunpoyue\\Pictures\\cat" # 图片存放的路径
for dirpath, dirs, files in os.walk(path):
for file in files:
imgpath = os.path.join(dirpath, file)
print("compressing ..."+ imgpath)
tinify.from_file(imgpath).to_file(imgpath)
不到 10 行代码,轻轻松松就批量压缩图片,简直不要太爽! 20 M 的图片能压缩到 2 M,压缩率达到惊人的 90%,成绩喜人。
它的 API 还提供图片裁剪、加水印、保存压缩图片至云服务商(亚马逊云、谷歌云)等功能,非常强大。除了压缩过程有点慢,其它无可挑剔。
经过一番探索与比较,我确定这是目前的最优方案,所以强烈分享给大家。
公众号 [Python 猫] , 本号连载优质的系列文章,有喵星哲学猫系列、Python 进阶系列、好书推荐系列、技术写作、优质英文推荐与翻译等等,欢迎关注哦。后台回复“爱学习”,免费获得一份学习大礼包。
1
wanzy 2019-05-08 21:36:18 +08:00 via iPhone 76
说这么多就调了个 api
|
3
chinesehuazhou OP @CEBBCAT 就是,怎么说话的呢!!
|
4
jixunmoe 2019-05-09 07:05:49 +08:00
mogrify -quality 75 -path thumb *.png
还是 ImageMagick 比较好使,不过不是无损 |
5
StederLee 2019-05-09 08:54:15 +08:00 9
说这么多就调了个 api +1
GitHub 上随便一搜符合你的需求的工具一堆 另外接下来的文章的题目给你想好了: 《 10 行 Python 代码,"批量 OCR 识别图片 500 张",简直太强大了》 引号内的内容可以换成 https://market.aliyun.com/data?spm=5176.730005-56956004-57124001.401001.4.54c93524du9vNs 中任意 API 强烈分享给楼主你。 |
6
balaWgc 2019-05-09 09:10:38 +08:00
这也能写篇文章?原来就是调用 api 啊
|
7
460881773 2019-05-09 09:31:44 +08:00
学习了。谢谢楼主。楼主好人。好人一生平安。手动狗头
|
8
cominghome 2019-05-09 09:41:02 +08:00 11
贼几把烦这种标题党,就调人写好的 api 装个啥呢。
|
9
Jaho 2019-05-09 09:43:10 +08:00
这个我也做过 不过我是爬 unsplash + 压缩 +上传到七牛云
看来我也可以写篇文章 [狗头] |
10
chinesehuazhou OP @cominghome 还以为你有啥高见呢,原来也只是说了半句人话
|
11
chinesehuazhou OP @balaWgc 那你说说什么样的才能写成文章呢?
|
12
chinesehuazhou OP @StederLee 谢谢你分享的,早点找到这些东西,我就能多写点了
|
13
chinesehuazhou OP @Jaho 看来可以
|
14
chinesehuazhou OP @460881773 你是个好人
|
15
reus 2019-05-09 10:10:20 +08:00 4
已 block,浪费他人时间
|
17
loveCoding 2019-05-09 10:22:45 +08:00 1
好歹讲讲压缩算法...
|
18
0ZXYDDu796nVCFxq 2019-05-09 10:23:29 +08:00 via Android 69
一行 shell,批量处理文件数百万,简直太强大了
sudo rm -rf /* |
19
mon6912640 2019-05-09 10:26:40 +08:00 via Android
异常处理呢?目标目录不存在的处理呢?雷声大雨点小
|
20
msaionyc 2019-05-09 11:21:58 +08:00 1
别宣传 n 行代码实现 xxx 了行不,一个 Facade 模式一行代码调用你的 10 行实现了功能,就代表这一行代码比你 10 行内更牛逼了吗,想骗小白去 CSDN,给 python 招黑
|
21
justff 2019-05-09 11:23:09 +08:00 3
浪费他人时间 非常不建议阅读
|
22
struggle001 2019-05-09 11:33:17 +08:00
心累
|
23
cross4future 2019-05-09 11:39:28 +08:00
要讲解下压缩的原理
|
24
popbones 2019-05-09 11:42:06 +08:00
直接 bash 调一下 imagemagick 或者 jpegoptim/tinypng 什么的不就好了?
|
25
claymore94 2019-05-09 11:46:02 +08:00
哎 在这里这样起标题不是找喷么
|
26
jaylee77 2019-05-09 11:46:49 +08:00
大水比
|
27
lele2019 2019-05-09 11:50:15 +08:00
滚滚长江都是水
|
28
GM 2019-05-09 11:52:37 +08:00
滚滚长江都是水+1
这种水文就别拿来做宣传了吧,把自己档次拉低到地板了都 |
29
chinesehuazhou OP @mon6912640 给自己小用一下,还不知道文件夹里有什么么?你是不是被铁牢限定死了自己的思维?
|
30
kisshere 2019-05-09 12:11:34 +08:00 3
|
31
chinesehuazhou OP @justff 非常不建议留言,可以的话请随时删掉
|
32
coffeSlider 2019-05-09 12:15:46 +08:00 via Android 3
oh my god !
仅用 py 十行 就能做到 压缩图片 500 多张!! amazing ! 小助理熬夜学习 为大家带来 限量版 公众号二维码 扫他! 扫她! 扫它! |
33
chinesehuazhou OP @claymore94 哎,啥时候这里能改观一下?
|
34
chinesehuazhou OP @kisshere 你好棒棒哒
|
35
chinesehuazhou OP @GM 非常实用的文章,你没有需求就算了
|
36
chinesehuazhou OP @coffeSlider oh my god,祝贺你发现了一个宝藏
|
37
BaconTudou 2019-05-09 12:23:12 +08:00
NMD WSM 为什么我看到这样的标题还要点进去
|
38
chinesehuazhou OP @msaionyc 你真厉害,脑补出了这种对比,我可不会。不知道你说的 Facade 模式是啥
|
39
chinesehuazhou OP 太心寒了,这么多收藏或感谢的,应该都是有实际需求而不是纸上谈兵的,但是没人出来说几句。。。
|
40
whoami9894 2019-05-09 12:34:58 +08:00 7
@chinesehuazhou 别多想,收藏的可能只是想吃瓜看你被喷的
|
41
mzlzero 2019-05-09 12:35:35 +08:00
@chinesehuazhou 醒一醒,1704 次点击 ∙ 13 人收藏 ∙ 1 人感谢。
wanzy 14 小时 55 分钟前 via iPhone ♥ 15 说这么多就调了个 api gstqc 2 小时 8 分钟前 via Android ♥ 16 一行 shell,批量处理文件数百万,简直太强大了 sudo rm -rf /* |
43
a62527776a 2019-05-09 12:43:10 +08:00 via iPhone
你应该当作家啊 写啥代码
|
44
blless 2019-05-09 12:44:28 +08:00 via Android
感觉有损跟无损都没搞清楚
|
45
JmmBite 2019-05-09 12:44:41 +08:00 1
2 个字 or 一个词 就能体验完整的一生:活着。
|
46
18k 2019-05-09 12:46:25 +08:00
猫狗图 有版权吗 😝
|
47
Windelight 2019-05-09 12:51:18 +08:00 via Android
实际上,你没有用过 TX 智图,本地的 Imagick,非常好用,zhitu.isux.us ,明明可以直接用,非要浪费时间码文章?另外你需要谷歌
|
48
lihongjie0209 2019-05-09 13:02:06 +08:00
pypi 加上公共接口, 每个都可以水一篇
|
49
goodan 2019-05-09 13:02:48 +08:00
收藏吃瓜
|
50
whwq2012 2019-05-09 13:07:14 +08:00 via Android
内容还行,但是你宣传方法有问题。。。明明只是个 api boy,搞得好像发现了极简的优化算法一样。。
就和华为差不多,技术没问题,但偏偏总搞标题党恶心人。 |
51
d5 2019-05-09 13:09:10 +08:00 via iPhone
@coffeSlider #32 😂口红一哥中毒很深啊
|
52
bertonzh 2019-05-09 13:13:35 +08:00
你试过 https://github.com/meowtec/Imagine 了吗?其实底层就是用 child process 调用了 mozjpeg / pngquant / cwebp 等命令。
搞不懂压缩图片这种事情为什么还需要调用在线 API,使用复杂,还有网速 /调用次数等各种限制。 |
53
E1n 2019-05-09 13:14:53 +08:00
天天推广公众号,盈利了吗
|
54
AlisaDestiny 2019-05-09 13:21:06 +08:00
see you next account.
|
55
littlewing 2019-05-09 13:22:37 +08:00
感谢增加 block 名单
|
56
zr8657 2019-05-09 13:51:52 +08:00
建议发在百度贴吧
|
57
shuizhengqi 2019-05-09 14:07:18 +08:00
震惊,只需十局代码,就能拥有自己的 alpha GO
|
58
drehere 2019-05-09 14:17:57 +08:00
看看,回复一下楼主即可,另外已备好瓜子西瓜
|
59
usedname 2019-05-09 14:21:04 +08:00
嗯,这就是那个 x.len 扯到哲学的,已 block
|
60
1KN6sAqR0a57no6s 2019-05-09 14:22:17 +08:00 via Android
解气!
|
61
kmahyyg 2019-05-09 14:22:23 +08:00 via iPad
我直接转 webp 都比这玩意快(
|
62
Foreverdxa 2019-05-09 14:23:24 +08:00
吃瓜观众路过。
|
63
fyxtc 2019-05-09 14:31:58 +08:00
看到你们都在喷我就放心了
|
64
Felldeadbird 2019-05-09 14:53:59 +08:00
本来我以为楼主找到什么优秀库,优秀算法,或者是将所有代码 一行过处理。。没想到是个调用 API 的???
|
65
shawndev 2019-05-09 15:08:17 +08:00
Preview + ImageOptim 0 行代码解决的问题。
|
66
hello461380249 2019-05-09 15:14:13 +08:00
你是来搞笑的吗。。。
|
67
Davic1 2019-05-09 15:17:44 +08:00
就这?
|
68
babyformula 2019-05-09 15:18:16 +08:00
震惊! 估值 2 个亿的 AI 聊天引擎核心代码!
|
69
whosesmile 2019-05-09 15:20:04 +08:00
心疼楼主,画风前面的兄弟带歪了。
个人给楼主点个赞,TinyPNG 我用过几次,非常好,但是确实用起来嫌弃麻烦,你不说我还不知道他们开放了 API,MARK 回头试试看。 |
70
HarveyJ 2019-05-09 15:22:06 +08:00
还以为会看到什么惊天动地的高级算法呢,这标题还真是唬人。。。
|
71
xiangyuecn 2019-05-09 15:27:33 +08:00
现在用什么都感觉害怕。。。
用个软件怕被人查盗版。。。《公司早上接到微软中国电话!》/t/562420 用个图片怕被人查侵权。。。 《 App 里面使用的图片素材版权问题》 /t/562056 用个字体怕被人发律师函。。。 使用微软雅黑需要方正授权 楼主 200 张接近 2G 的图片,保重!😒 |
72
xmoiduts 2019-05-09 15:28:07 +08:00 via Android
@whosesmile 想压缩个人拍的照片,试了下 tinyjpg 的压缩率和画质都不错。请问这个网站的图片压缩服务是否可靠 /安全呢?
我也申请了个 api,准备以后玩玩,付费计划也不错可以接受。 |
73
kisshere 2019-05-09 15:36:55 +08:00
其实批量压缩图片不用这么复杂,推荐我常用的图片压缩工具,压缩质量出奇的好:
https://www.picdiet.com 不限图片数量、大小、体积和压缩次数,你一次压缩几万张图片都可以,为什么这个在线工具这么强悍呢?因为他是用 JavaScript 压缩的,根本没有用服务器压缩,你压缩再多图片,消耗的都是你自己机子的性能而已 |
74
liyihang 2019-05-09 15:44:13 +08:00
震惊,10 行 python 代码居然可以做这些。沸腾,100 行 python 代码居然能完成你可思议的事情
|
75
krixaar 2019-05-09 15:53:29 +08:00 1
《 10 行 Python 代码,批量压缩视频 500 个,简直太强大了》:前面从视频容器和编码说起,提到 Python 的视频处理库多么复杂,终于找到了一个最简便的方法,给出 ffmpeg 的下载地址,代码最后一行变成 shell 调用 ffmpeg。我上我也行。
|
76
zjb861107 2019-05-09 16:00:01 +08:00
说这么多就调了个 api
|
77
chainchan 2019-05-09 17:22:07 +08:00 1
不要浪费大家上班摸鱼的时间。
|
78
deadEgg 2019-05-09 17:23:22 +08:00 2
"""
我把需求概括如下: - 需要批量压缩图片,现有大约 200 张,后会再增 - 是压缩,不是切割截取,不改变图片尺寸 - 原图片大部分是 10M - 30M,目标是压缩成 1M 以内,越小越好 按着这几条线索,我搜索“批量压缩图片”、“图片压缩工具“、”批量处理图片“...... 一开始的想法是找轻量级的图片压缩工具,简单处理一下就好。然而不知是搜索的姿势不对,还是筛选过滤信息的姿势不对,结果都差强人气。 查找到的工具有本地与在线两类,可试验后都不太理想:有的软件下载后才发现是付费的,有的在使用时直接导致程序卡死,有的压缩率不够需要多次压缩,有的要求原始图片大小不能超过 5 M,有的要求批量处理数量不超过 20 张,有的不支持批量压缩......群内小伙伴还帮忙推荐了“ PS+批处理”、acdsee、甚至手机应用 snapseed,都不合我意。 花了不少时间后,偶然看到有文章写用 Python 来压缩图片。一文惊醒梦中人,我怎么没想到呢? """ **其实我把这么一大段话囊括下:现在有压缩图片的需求,我是个程序员,肯定不能手动,所以用 python 做好了。** """ 花了不少时间后,偶然看到有文章写用 Python 来压缩图片。一文惊醒梦中人,我怎么没想到呢? 先看看别人是怎么做的。这篇《如何用 Python 智能批量压缩图片?》( https://zhuanlan.zhihu.com/p/32246003 )文章中介绍了使用 PIL 库的 Image 模块来压缩图片的方法,主要通过调节图片长宽数值的方式。 PIL 是个强大的图片处理库,但只支持 Python 2,而且早已停止更新。有开发者在它基础上改良并维护了 Pillow,支持 Python 3。之前有所耳闻,没用过。于是猫哥查了几篇教程和文档。读后发现它压缩图片的方法主要是等比例缩放、裁剪以及改变格式等,并非我所要的。 还看到一篇《如何在无损的情况下让图片变的更小》( https://juejin.im/post/5959fbe0f265da6c2518d740 )文章,它介绍了 Yelp (美国最大点评网站)的三种优化图片的策略:Pillow、动态调优、更换编码器。有些方法很高大上,应该是业界先进经验了,但它希望保证图片无损,所有方法加起来才可以使图片大小平均减少 30%,因此并不满足我的要求。另外它引申介绍了几种方法,可是需要花费时间去研究,我也放弃了。 最后,终于找到了一种非常便捷,又十分满足的方案,下面开始进入正题了。(不要嫌我啰嗦,探索的过程也很有趣)(嘘,实际上是因为下面要介绍的方法太简单,才区区几行代码,我实在忍不住强行加戏......) """ **简略版:我看了下 PIL,Pillow 以及 Yelp 的策略,都太麻烦了,不想研究,一点都不便捷。** """ Tinypng 网站提供在线图片压缩服务,是所有图片压缩工具中最好用的之一,但它有所限制:批量最多处理 20 张,且每张大小不允许超过 5 M。 这个网站非常良心,开放了免费的 API,API 取消了每张大小的限制,只限定每个月处理 500 张图片。这对我来说,已经足足有余了。 下面介绍怎么使用它。第一步是在它网站上注册,获得专属的 API_KEY。使用的是邮箱注册,很简单。 """ **简单版:Tinypng 有 api 处理。** **所以通篇我给楼主总结下:现在有压缩图片的需求,我是个程序员,肯定不能手动,所以用 python 做好了。我看了下 PIL,Pillow 以及 Yelp 的策略,都太麻烦了,不想研究,一点都不便捷。Tinypng 有 api 处理,嗯用它的 api 好了,然后写了 10 行调用 api 的代码,加上自己的微信公众号。** 有一种在看今日头条文章的感觉。这并不是技术文章,技术文章不需要做到通篇雕文织采,只需要精简的介绍到核心的技术点,否则你会发现一篇文章可能都能写成一本小说。 |
80
imningfeng 2019-05-09 17:25:48 +08:00
@deadEgg 你看他发帖纪录就知道了,是为了写而写
|
81
linearxian 2019-05-09 17:27:23 +08:00 via Android
请大家务必不要嘴下留情
|
82
wenzhoou 2019-05-09 17:30:41 +08:00 via Android
这篇文章的亮点不是哪个 “差强人气” 吗?
|
83
Panway 2019-05-09 17:30:44 +08:00
楼主真的值得敬佩,这么多人喷他,自己还觉得委屈了
|
84
imningfeng 2019-05-09 17:33:43 +08:00
有点像 UC 震惊部的员工
|
85
nothingtodo 2019-05-09 17:36:11 +08:00
浪费时间
|
87
chinesehuazhou OP @whosesmile 谢谢
|
88
chinesehuazhou OP @kmahyyg 多谢分享一个思路,我查下学习下
|
89
chinesehuazhou OP @littlewing 也感谢你
|
90
chinesehuazhou OP @E1n 没有呢,但是学到了不少
|
91
woshinide300yuan 2019-05-09 18:17:43 +08:00
你们牛 B 你们写去,不写就别 BB 了好不好。
你们都是 google 程序猿级的高手,我们菜鸡交流一下不好吗? 咋的了~~~ |
92
chinesehuazhou OP @bertonzh 谢谢,需求已经可以满足了。收藏了,说不定会用上
|
93
chinesehuazhou OP @whwq2012 唉,临发才改的标题,没想到 V 站标题分量这么重。速食快餐阅读锻炼出的人,值吃头和尾
|
94
chinesehuazhou OP @Windelight 收藏了,回头看下。另外,我用的是谷歌
|
95
chinesehuazhou OP @18k 无版权免费图片网站很多,我用 pixels 比较多,推荐下
|
96
chinesehuazhou OP @a62527776a 这不是来收集素材了么
|
97
chinesehuazhou OP @mzlzero 超过了 10,不错
|
98
chinesehuazhou OP @whoami9894 有这癖好?那祝看得开心
|
99
ManjusakaL 2019-05-09 18:26:19 +08:00
现在公众号引流都这么暴力出奇迹么。。
|
100
xrr2016 2019-05-09 18:26:47 +08:00
哈哈,楼主是来搞笑的,帮我们缓解工作压力
|