当前位置: 首页 > Linux

10 行 Python 代码,批量压缩图片 500 张,简直太强大了

时间:2023-04-06 21:06:53 Linux

10行Python代码,批量压缩500张图片,简直太强大了原文地址:https://mp.weixin.qq.com/s/5hpFDgjCpfb0O1Jg-ycACw熟悉“Python猫”的读者应该都知道我发表的文章使用很有特色的图片——原创文章使用猫图,转载文章使用狗图,极少数例外。这几天在使用Githubpage+hexo搭建个人网站。为了延续风格,想把图片和文章一起迁移。这时出现了一个问题:我用的图片都是高清大图,放在网站上严重拖慢了加载速度。因此,图片在上传前需要进行压缩。我总结需求如下:图片需要批量压缩,大概有200张左右,以后会增加更多。是压缩,不是剪切截取,不改变图片大小。大多数原始图片是10M-30M。目标是将它们压缩到1M以内,越小越好。顺着这些线索,我搜索了“批量压缩图片”、“图片压缩工具”、“批量处理图片”……最初的想法是想找一个轻量级的图片压缩工具,简单的一键处理。不过不知道是搜索的姿势不对,还是筛选和过滤信息的姿势不对,结果不是很受欢迎。找到的工具有两种:本地的和在线的,但是经过测试,都不太理想:有的软件下载下来发现是付费的,有的直接导致程序在使用时卡死,有的压缩率不够和需要多次压缩,有的要求原图大小不超过5M,有的要求批量处理次数不超过20张,有的不支持批量压缩……群里的小伙伴还帮忙推荐了“PS+批处理”,acdsee,连手机appsnapseed都不合我胃口。折腾了很久,偶然看到一篇用Python压缩图片的文章。伊文惊醒了做梦的人,我怎么没想到呢?先看看别人是怎么做的。这篇《如何用Python智能批量压缩图片?》(https://zhuanlan.zhihu.com/p/32246003)文章介绍了使用PIL库的Image模块压缩图片的方法,主要是调整图片的长宽。PIL是一个强大的图像处理库,但是只支持Python2,而且早就停止更新了。一些开发者基于它改进和维护了Pillow以支持Python3。我以前听说过它,但从未使用过它。于是毛哥查了好几个教程和文档。看了之后发现它压缩图片的方式主要是比例缩放、裁剪和变换格式等,这些都不是我想要的。还看到一篇文章《如何在无损的情况下让图片变的更小》(https://juejin.im/post/5959fbe0f265da6c2518d740),介绍了Yelp(美国最大的评论网站)优化图片的三种策略:Pillow,动态调优,换编码器.有些方法很先进,应该是业内比较先进的经验,但是希望保证图像无损,而且所有的方法都可以平均缩小30%的图像大小,所以不符合我的要求。另外介绍了几个方法,但是研究起来费时间,就放弃了。最后,我终于找到了一个非常方便和满意的解决方案,现在我要进入正题了。(别嫌我啰嗦,探索的过程也很有趣)(嘘,其实是因为下面要介绍的方法太简单了,就几行代码,忍不住了加戏...)-----------------小心的分割线----------------Tinypng网站提供在线图片压缩服务,即所有图片压缩工具中最好用的一款,但是有局限性:一个batch最多可以处理20张,每张的大小不允许超过5M。这个网站很良心,开放了免费的API。API取消了每张图片的大小限制,每月只限制处理500张图片。这对我来说绰绰有余。下面是如何使用它。第一步是在其网站上注册并获得专属的API_KEY。通过电子邮件注册非常简单。然后安装包:pipinstall--upgradetinify然后处理图片:importtinifyimportostinify.key='fillinyourkeyhere'path="C:\\Users\\yunpoyue\\Pictures\\cat"#路径在os.walk(path)中为目录路径、目录、文件存储图像的位置:对于文件中的文件:imgpath=os.path.join(dirpath,file)print("compressing..."+imgpath)tinify.from_file(imgpath).to_file(imgpath)不到10行代码,轻松实现图片批量压缩,简直不要太爽!一张20M的图片可以压缩到2M,压缩率达到了惊人的90%,这是一个可喜的成绩。其API还提供了图片裁剪、水印、将压缩图片保存到云服务商(AmazonCloud、GoogleCloud)等功能,非常强大。除了压缩过程有点慢外,其他一切都完美无缺。经过摸索和比较,我确定这是目前最好的方案,所以强烈分享给大家。公众号【Python猫】,本号连载系列精品文章,包括喵星哲学猫系列、Python进阶系列、好书推荐系列、技术写作、优质英文推荐与翻译等,欢迎收看注意。后台回复“爱学习”,免费领取学习大礼包。