10 行 Python 代码,批量压缩图片 500 张,简直太强大了(内有公号宣传,不喜勿进)

2019-05-08 21:13:13 +08:00
 chinesehuazhou

本文原创并首发于公众号 [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 进阶系列、好书推荐系列、技术写作、优质英文推荐与翻译等等,欢迎关注哦。后台回复“爱学习”,免费获得一份学习大礼包。

12015 次点击
所在节点    Python
128 条回复
kmahyyg
2019-05-09 14:22:23 +08:00
我直接转 webp 都比这玩意快(
Foreverdxa
2019-05-09 14:23:24 +08:00
吃瓜观众路过。
fyxtc
2019-05-09 14:31:58 +08:00
看到你们都在喷我就放心了
Felldeadbird
2019-05-09 14:53:59 +08:00
本来我以为楼主找到什么优秀库,优秀算法,或者是将所有代码 一行过处理。。没想到是个调用 API 的???
shawndev
2019-05-09 15:08:17 +08:00
Preview + ImageOptim 0 行代码解决的问题。
hello461380249
2019-05-09 15:14:13 +08:00
你是来搞笑的吗。。。
Davic1
2019-05-09 15:17:44 +08:00
就这?
babyformula
2019-05-09 15:18:16 +08:00
震惊! 估值 2 个亿的 AI 聊天引擎核心代码!
whosesmile
2019-05-09 15:20:04 +08:00
心疼楼主,画风前面的兄弟带歪了。
个人给楼主点个赞,TinyPNG 我用过几次,非常好,但是确实用起来嫌弃麻烦,你不说我还不知道他们开放了 API,MARK 回头试试看。
HarveyJ
2019-05-09 15:22:06 +08:00
还以为会看到什么惊天动地的高级算法呢,这标题还真是唬人。。。
xiangyuecn
2019-05-09 15:27:33 +08:00
现在用什么都感觉害怕。。。

用个软件怕被人查盗版。。。《公司早上接到微软中国电话!》/t/562420
用个图片怕被人查侵权。。。 《 App 里面使用的图片素材版权问题》 /t/562056
用个字体怕被人发律师函。。。 使用微软雅黑需要方正授权

楼主 200 张接近 2G 的图片,保重!😒
xmoiduts
2019-05-09 15:28:07 +08:00
@whosesmile 想压缩个人拍的照片,试了下 tinyjpg 的压缩率和画质都不错。请问这个网站的图片压缩服务是否可靠 /安全呢?
我也申请了个 api,准备以后玩玩,付费计划也不错可以接受。
kisshere
2019-05-09 15:36:55 +08:00
其实批量压缩图片不用这么复杂,推荐我常用的图片压缩工具,压缩质量出奇的好:
https://www.picdiet.com
不限图片数量、大小、体积和压缩次数,你一次压缩几万张图片都可以,为什么这个在线工具这么强悍呢?因为他是用 JavaScript 压缩的,根本没有用服务器压缩,你压缩再多图片,消耗的都是你自己机子的性能而已
liyihang
2019-05-09 15:44:13 +08:00
震惊,10 行 python 代码居然可以做这些。沸腾,100 行 python 代码居然能完成你可思议的事情
krixaar
2019-05-09 15:53:29 +08:00
《 10 行 Python 代码,批量压缩视频 500 个,简直太强大了》:前面从视频容器和编码说起,提到 Python 的视频处理库多么复杂,终于找到了一个最简便的方法,给出 ffmpeg 的下载地址,代码最后一行变成 shell 调用 ffmpeg。我上我也行。
zjb861107
2019-05-09 16:00:01 +08:00
说这么多就调了个 api
chainchan
2019-05-09 17:22:07 +08:00
不要浪费大家上班摸鱼的时间。
deadEgg
2019-05-09 17:23:22 +08:00
"""
我把需求概括如下:

- 需要批量压缩图片,现有大约 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 的代码,加上自己的微信公众号。**

有一种在看今日头条文章的感觉。这并不是技术文章,技术文章不需要做到通篇雕文织采,只需要精简的介绍到核心的技术点,否则你会发现一篇文章可能都能写成一本小说。
deadEgg
2019-05-09 17:24:06 +08:00
@deadEgg 忘记 v2 回复不是 markdown 了。
imningfeng
2019-05-09 17:25:48 +08:00
@deadEgg 你看他发帖纪录就知道了,是为了写而写

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/562327

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX