python应用——借助tinify库实现批量压缩图片
说在前面的话:
转到移动组之后,干起了移动端混合开发,虽说现在的混合开发技术在不断的迭代了,但对比起网页应用来说有一些先天的不足,诸如,硬件性能就是很大的一方面。在pc上调试的非常OK,都要断电下班 ,测试完却发现在移动端一个页面白屏了两秒才加载出来文字,嘤嘤嘤。又只能开始漫长又不明细的优化道路了。根据我做pc端的经验来说。优化见效最明显,最容易的方法之一就是对图片进行适当的压缩,那性能是肉眼可见得蹭蹭往上涨。对于要频发打包文件的移动端来说也是一大福音。
压缩图片的网站我也是有关注的,每个压缩工具都有利弊,有些工具不限制压缩个数,但会更改图片的大小,有的压缩率好并且不会更改原有图片名称,但会限制压缩个数,其中 TinyPNG 是我用的比较顺手的一个压缩网站。
可美中不足的是压缩图片一次性只能20张并且每张的图片大小不超过5MB,对于时间紧任务重的,图片还贼多的项目来说,要20张20张的压缩的确是有点反人心话了,好在该网站提供了pro版本的,但需要$39 哦,对于白嫖党来说有点小贵了。
在我胆大心细的浏览网页之下,看到了一个好东西 “开发者API”这几个字,我看到的是简简单单的这三个汉字和三个英文单词吗?不!我们看到的是我们拥有了二次开发Tniy 压缩图片的能力。我们看到的是可以通过简简单单几行代码来批量压缩。
但凭借我多年的白嫖的经验来说,这些开放的接口一般都会有限制,果不其然,注册成开发者之后发现,免费的接口压缩个数只有每个月500张图片。说多不多说少不少,但这不妨碍我们借用tinify的接口来压缩图片的代码编写。
撸代码第一步:查看接口文档
开发者模式中,提供了ruby gem,php程序库,node.js包,python包等,我们选择python包,
第二步安装tinify 提供的第三方库:pip install --upgrade tinify
第三步,需要填写api密钥来调用页面tinify 包,获取api密钥的方法是注册姓名和email地址
接下来是代码部分
import tinify tinify.key = "YOUR_API_KEY"#注册的tinify密钥 source = tinify.from_file("xxx/xxx/demo.png")#需要压缩的图片路径 source.to_file("xxx/xxx/save.png")#保存的图片路径
压缩的图片也可以变成二进制流
with open("xxx/demo.jpg", 'rb') as source: source_data = source.read() result_data = tinify.from_buffer(source_data).to_buffer()
图片的来源也可以是一段地址,那就要调用from_url方法:
source = tinify.from_url("https://tinypng.com/images/panda-happy.png") source.to_file("optimized.png")
知道了以上接口我们就可以编写一段简单的代码来批量压缩图片了:
三!
二!
一!
上代码:
import tinify import os import time #遍历文件夹获取文件信息 def walkdir(file): for root,dirs,files in os.walk(file): for f in files: m=os.path.join(root,f) name=os.path.basename(m) houzui=name.split('.')[1] fileList.append({ "url":root,#路径名称 "name":name,# "ext":houzui }) #压缩文件 def Compress(): for item in fileList: print('url',item["url"]) print('name',item["name"]) sfile=item["url"]+"\\"+item["name"]; newUrl=item["url"].replace("needCompress","saveCompress");#保存新的文件地址 if(not os.path.exists(newUrl)): os.makedirs(newUrl) tfile=newUrl+"\\"+item["name"] try: if(["jpeg","png"].index(item["ext"])>-1 and item["ext"]): source = tinify.from_file(sfile) source.to_file(tfile) except : print('error',item) #打印出错误 continue #启动入口 if __name__=="__main__": begintime=time.time() print('start') tinify.key="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"#申请的key fileList=[] walkdir(r'E:\pytiny\needCompress') Compress() endtime=time.time() print('end') print("total-time",endtime-begintime)
进阶:
以上代码可以进行最基础的压缩功能,但如果想优化,优化的方面有太多了,比如优化压缩时间,可以进行多线程压缩。比如配置不灵活,可以将配置抽出放在一个json文件进行读取配置。
本文来自博客园,作者:七分暖,转载请注明原文链接:https://www.cnblogs.com/lin494910940/p/16870629.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签