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文件进行读取配置。

 

posted @   七分暖  阅读(535)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签
感觉不错来个赞@_@
回到顶部
点击右上角即可分享
微信分享提示