首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

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

  •  
  •   chinesehuazhou · 159 天前 · 8465 次点击
    这是一个创建于 159 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    另外你这相当于,《教你 10 分钟就能吃到出麦当劳一样的汉堡!》点开是个外卖电话一样。
        126
    xiexiangrui   158 天前
    java 写过, 当时是有需求才写的, 好歹来个多线程,进度什么的吧
        127
    GrahamACER   158 天前
    哈哈哈哈哈哈哈
        128
    waytocode   153 天前
    我觉得我白高兴一场了..
    1  2  
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3095 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 11:05 · PVG 19:05 · LAX 04:05 · JFK 07:05
    ♥ Do have faith in what you're doing.