Python in my GitHub

Python在七牛云平台的应用(二)图片瘦身

(一)七牛云平台的图片瘦身功能简介:(引用自官网)

针对jpeg、png格式图片

  1. 瘦身后分辨率不变,格式不变。
  2. 肉眼画质不变。
  3. 图片体积大幅减少,节省 CDN 流量

官网给的图片压缩率很高,官网给的「葡萄」图片瘦身在不改变分辨率和格式的情况下压缩率为65.49%,我自己测试了一张小图在后文中会有,原来的大小在「22kb」压缩后为「18kb」,据一般情况来看,压缩率虽然没有官网给的那么夸张,但是也能基本达到80%左右,所以这个压缩率还是很不错的.

 

(二)需求分析

我们可以设想几个场景

『1:当你在网站上图片加载都需要流量,而压缩率80%几乎就是直接把花的钱*0.8,如果图片很多,那这将能够节约一大笔钱』

『2:有时候会让向网站上传自己的证件照/免冠照,往往还会限定照片的大小,而这个时候如果大小超出了,一般情况下只能通过转格式,裁剪等方式.而七牛的图片瘦身在这种情况下就能产生了作用了』

『3:由于七牛的介绍-肉眼画质不变(上面高亮处已经标出),那么当今很多图片的大小相当恐怖,如果存储在硬盘上也是一个很大的开支,如果经过了图片瘦身,这就能省下很大的硬盘开销,压缩体积.』

总结:以上列举的场景不难看出图片瘦身对我们还是有很多应用的,下面就对于怎么在python中使用七牛的图片瘦身功能进行介绍.

 

(三)使用这个接口的准备

这里需要上一篇博文中的操作七牛云空间的方法->Python在七牛云平台的应用(一) (传送门)

我们需要用到的有qiniu库的上传/鉴权命令.以及requests库得到处理后的图像

七牛的这个接口是要付钱的,不过很便宜,可先向自己的账户充入¥1避免无法使用的情况,具体的收费为¥0.1/1000次

 

(四)解决问题的步骤

首先,我们先分析七牛云的这个API的接口:

http://xxx.xxx.glb.clouddn.com/xxx.jpg?imageslim
<!--这里的实际接口就是在最后面的 ?imageslim 前面的是空间的外链地址和文件名-->

可以得知它的处理方式为在我们自己的bucket中的文件的外链地址后面加上?imageslim即可获得压缩后的图像

所以我们要进行的步骤如下:

1)上传指定类型的图像到我们的bucket中(判定是否为jpeg和png格式)-用split对文件后缀进行分析并用上一篇中的上传到七牛云的方法对文件上传.

2)得到上传的图片的外链地址

3)准备requests库的params属性将imageslim加到链接后面并请求.

4)将图片以二进制的形式写入图片中

 

(五)程序的实现,请见下方代码:操作的图片还是uptest.jpg

#七牛云"图片瘦身"功能的python实现方法:
#请得到自己的secret和access key用于上传图片到空间中进行处理
#图片瘦身是七牛云的一项收费项目,价格为 ¥0.1/1000次 测试时请先存1元进入

#import SDK
from qiniu import Auth,put_file,etag
import qiniu.config
import requests

#指定图片处理后缀的格式
picu=['jpg','jpeg','png','PNG','JPEG','JPG']

#上传
def upload(bucket,path,filename,key,url):
    token = key.upload_token(bucket, filename, 3600)
    print('正在上传..')
    reform,inform = put_file(token, filename, path)
    if reform != None:
        print('已经成功地将{}->>{}'.format(filename,bucket))
        print("正在处理您的图片...")
        url=url + '/' + filename
        path=path.split('/')[-1]
        download(url,path)
    else:
        print('这里出现了一个小错误.无法上传..')
        
        
#下载
def download(url,path):

    if url.split('.')[-1] in picu:
        r = requests.get(url,params='imageslim')
        r.raise_for_status()
        contenter=r.content
        with open(path,'wb') as filer:
            filer.write(contenter)
            filer.close()
        print("已经将转换后的文件{}保存到了本地".format(path))
    else:
        print('抱歉,您的图片的格式不支持瘦身操作.')

    
#主体
def main():
    #填写你的 AK 和 SK
    accesskey = input('请输入您在七牛云的AccessKey:')
    secretkey = input('请输入您在七牛云的SecretKey:')

    #鉴定身份
    keyq=Auth(accesskey,secretkey)
    
    #所要操作的空间
    bucketname =input("请输入要操作的空间(公开)名字:")

    #所要操作空间的外链地址
    urlbucket = input("请输入空间所绑定的域名或者默认外链地址:")

    #判定操作类型
    while 1:
        order=input('请输入你需要进行的操作:')
        mode=order.split(' ')[0]
        if mode == '转换':
            path=order.split(' ')[1]
            fname=path.split('/')[-1:][0]
            print('正在尝试生成Token.请稍后..')
            upload(bucketname,path,fname,keyq,urlbucket)
        if mode == '退出':
            print("欢迎您的使用..")
            break

print("+----------------------------------------+")
print("|         欢迎使用七牛的图片瘦身功能         |")
print("+----------------------------------------+")
print("|本程序须知:                              |")
print("|1.七牛只能对jpg和png格式的图片进行瘦身       |")
print("|2.您需要提供服务的Accesskey,Secretkey     |")
print("|3.您需要提供 bucket名字和bucket外链地址.    |")
print("+----------------------------------------+")
print("|使用方法:                                |")
print("|1.瘦身输入格式: 转换 图片位置(包括后缀).    |")
print("|2.退出输入格式: 退出                      |")
print("+----------------------------------------+")
main()

程序运行的截图:

 图片瘦身程序运行截图

被程序压缩的图片:(压缩前约22kb)                                                

压缩前的图片 

压缩后的图片:(压缩后约18kb)

瘦身后的图片

 

(六)错误分析

 根据官网的说明,当发生错误时会返回原图.

 

(七)总结和拓展

 总结:这一次探究的就是七牛云的第一个API-图片瘦身(imageslim),这个在我们的生活中还是应用中都能获得受益,再之后的几篇博文中我也会继续分享好的七牛云的API和怎么使用.

 拓展:1.在一个文件夹下有很多图片得情况下可以通过遍历文件夹批量进行“瘦身”

         2.上传后如果空间足够也可以作为图片备份当图片误删时候可以及时恢复

posted @ 2017-03-31 22:06  xlxw  阅读(707)  评论(0编辑  收藏  举报