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