V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
chinesehuazhou
V2EX  ›  Python

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

  •  
  •   chinesehuazhou · 2019-05-08 21:13:13 +08:00 · 11373 次点击
    这是一个创建于 1786 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本文原创并首发于公众号 [Python 猫] ,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/5hpFDgjCpfb0O1Jg-ycACw

    熟悉 “ Python 猫” 的读者应该知道,猫哥我发布的所有文章都使用了极具特色的配图——原创文章使用猫图,转载文章使用狗图,极少例外。

    这几天,我在用 Github page + hexo 搭建个人网站,为了延续风格,就想把配图与文章一起迁移过去。这时候就出现了一个难题:我所用的图片都是高清大图,放到网站上就严重拖慢了加载速度。因此,需要先把图片压缩,再上传。

    我把需求概括如下:

    • 需要批量压缩图片,现有大约 200 张,后会再增
    • 是压缩,不是切割截取,不改变图片尺寸
    • 原图片大部分是 10M - 30M,目标是压缩成 1M 以内,越小越好

    按着这几条线索,我搜索“批量压缩图片”、“图片压缩工具“、”批量处理图片“......

    一开始的想法是找轻量级的图片压缩工具,简单处理一下就好。然而不知是搜索的姿势不对,还是筛选过滤信息的姿势不对,结果都差强人气。

    查找到的工具有本地与在线两类,可试验后都不太理想:有的软件下载后才发现是付费的,有的在使用时直接导致程序卡死,有的压缩率不够需要多次压缩,有的要求原始图片大小不能超过 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 进阶系列、好书推荐系列、技术写作、优质英文推荐与翻译等等,欢迎关注哦。后台回复“爱学习”,免费获得一份学习大礼包。

    128 条回复    2019-05-14 22:48:57 +08:00
    1  2  
    JsonLee
        101
    JsonLee  
       2019-05-09 18:28:24 +08:00
    chinesehuazhou
        102
    chinesehuazhou  
    OP
       2019-05-09 18:28:59 +08:00 via Android
    @ManjusakaL 大佬,真不是本意,我还以为是会无人问津呢
    chinesehuazhou
        103
    chinesehuazhou  
    OP
       2019-05-09 18:29:27 +08:00 via Android
    @xrr2016 看看留言,缓解加班压力
    zdb1115
        104
    zdb1115  
       2019-05-09 18:31:14 +08:00 via Android
    学习一下。
    killerv
        105
    killerv  
       2019-05-09 20:29:02 +08:00
    哈哈哈哈哈哈哈哈哈哈嗝
    Bramblex2
        106
    Bramblex2  
       2019-05-09 20:41:35 +08:00
    把除了那 10 行代码以外的字全删了这就是一篇好文章
    arraysnow
        107
    arraysnow  
       2019-05-09 21:07:00 +08:00   ❤️ 3
    首先感谢楼主提供 api,如果能提供官方接口文档就接近完美了;
    其次楼主文采值得提高,如果能缩略到 100 字完全完美了;
    最后我先把楼主加入 block,期待看到楼主完美的那一天
    Lawskiy
        108
    Lawskiy  
       2019-05-09 21:22:08 +08:00
    楼主,分享这些东西你来错地方了。。。。
    这里面的老哥们不说专业搞这个,也是身经百战了,真的唬不住😂
    chinesehuazhou
        109
    chinesehuazhou  
    OP
       2019-05-09 21:31:02 +08:00 via Android
    @Lawskiy 换个标题也许会好点,没想到有些人的神经那么敏感
    chinesehuazhou
        110
    chinesehuazhou  
    OP
       2019-05-09 21:32:29 +08:00 via Android
    @Bramblex2 把你用户名最后一个字符之前的字符删掉,这就是一个好名字
    yufeng0681
        111
    yufeng0681  
       2019-05-09 21:40:03 +08:00 via Android   ❤️ 1
    bkviewer,300kb 的绿色程序,满足你的所有需求。
    还是你找工具的能力偏弱。
    摄影爱好者会用这个批量压缩图片,不怎么损失画质
    cyanray
        112
    cyanray  
       2019-05-09 21:40:39 +08:00
    公众号真是无处不在
    chinesehuazhou
        113
    chinesehuazhou  
    OP
       2019-05-09 21:49:34 +08:00 via Android
    @yufeng0681 多谢分享。下次都不需要搜索引擎了,直接发个帖问
    mseasons
        114
    mseasons  
       2019-05-09 22:41:37 +08:00
    wdnmd,真就 10 行代码呗
    H0H
        115
    H0H  
       2019-05-09 23:11:56 +08:00
    不就是一行代码吗:
    tinify.from_file(imgpath).to_file(imgpath)

    用其他语言写封装成函数后也只是一行调用代码而已。

    可能楼主刚入行吧。
    Zzdex
        116
    Zzdex  
       2019-05-10 01:03:52 +08:00 via iPhone
    笑死我了,说这么多 我以为介绍特 殊算法呢 10 行解决,结果跳出来个 tinypng ..
    Kylin30
        117
    Kylin30  
       2019-05-10 05:15:01 +08:00   ❤️ 1
    你应该发在外面的技术社区,比如卖教程的,python 入门的那些论坛,你在这儿发就像是在军营里教人装子弹。
    bellchu
        118
    bellchu  
       2019-05-10 06:59:25 +08:00
    我大儿子 9 岁,刚学 Python 没多久,也会 import 了,可喜可贺
    Loner233
        119
    Loner233  
       2019-05-10 07:41:55 +08:00 via Android
    @StederLee 以前看过一个几十行 JS 人脸识别的,差不多也是调个 API
    JerryCha
        120
    JerryCha  
       2019-05-10 08:26:40 +08:00
    你这文章真的只能活在公众号里忽悠小白,来错地方了。这里能用一行代码调 ffmpeg 处理 resize 需求的人多达 114514 个。
    我本来以为是调用了哪个库哪个库解决了这个问题,妹想到居然调了个在线 API。。。
    huiyifyj
        121
    huiyifyj  
       2019-05-10 09:04:12 +08:00 via Android
    也就是调用 API 而已, 还是在线 API😶🙃。还以为是自己写呢。
    yejianmail
        122
    yejianmail  
       2019-05-10 09:11:16 +08:00 via Android
    我在网易新闻看到了同样的标题,我以为走错片场了
    doublemelting
        123
    doublemelting  
       2019-05-10 09:20:28 +08:00   ❤️ 1
    现在真是什么人都可以写公众号了
    keepeye
        124
    keepeye  
       2019-05-10 09:22:08 +08:00
    还以为发现新大陆了,原来只是调别人的 api
    tutustream
        125
    tutustream  
       2019-05-10 09:30:26 +08:00
    我用 caesium,本地压缩速度快无限制。

    另外你这相当于,《教你 10 分钟就能吃到出麦当劳一样的汉堡!》点开是个外卖电话一样。
    xiexiangrui
        126
    xiexiangrui  
       2019-05-10 16:49:36 +08:00
    java 写过, 当时是有需求才写的, 好歹来个多线程,进度什么的吧
    GrahamACER
        127
    GrahamACER  
       2019-05-10 17:38:10 +08:00
    哈哈哈哈哈哈哈
    waytocode
        128
    waytocode  
       2019-05-14 22:48:57 +08:00
    我觉得我白高兴一场了..
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3602 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 04:39 · PVG 12:39 · LAX 21:39 · JFK 00:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.