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 @ 2022-11-09 10:34  七分暖  阅读(515)  评论(0编辑  收藏  举报
回到顶部