tinify模块
by: uizuizui
功能描述:TinyPNG和TinyJPG网站提供了压缩和优化.png和.jpg格式图片的功能。虽然可以很轻松地使用网页版进行操作,但是在搭建个人博客的时候,调用网站提供的API更为方便快捷。tinify模块就是由TinyPNG提供的使用Python调用Tiny PNG API的模块。
安装
使用pip进行安装:pip install --upgrade tinify
获取API key
如果想调用TinyPNG的API,需要先在他们的网站TinyPNG Developer API上申请一个API key用于身份验证。只需要提供你的名字和邮箱地址就可以获得一个API key,API key会以链接的形式发到邮箱里。
注意:无法使用qq邮箱申请key,建议申请一个Live邮箱,配合windows上的Outlook使用
压缩图片
导入模块,进行身份验证:
import tinify
tinify.key = "API_KEY" # 此处填入你自己申请的API key
上传文件:
文件上传的形式共有三种:本地文件、二进制、URL。
上传文件后,服务器会自动识别文件类型,根据类型自动调用TinyPNG或TinyJPG的压缩引擎。调用to_file函数就可以将压缩优化过后的图片保存至本地。
实例代码:
# 使用本地文件上传
source = tinify.from_file("unoptimized.jpg")
source.to_file("optimized.jpg")
# 使用二进制上传
with open("unoptimized.jpg", 'rb') as source:
source_data = source.read()
result_data = tinify.from_buffer(source_data).to_buffer()
# 使用url上传
source = tinify.from_url("https://cdn.tinypng.com/images/panda-happy.png")
source.to_file("optimized.jpg")
改变图片尺寸
调用resize函数便可以将图片调整至自己想要的尺寸,以创建缩略图。需要注意的是:调用resize缩小图片尺寸将会消耗API调用次数,每调用一次resize相当于压缩一张图片。
source = tinify.from_file("large.jpg")
resized = source.resize(method="fit", width=150, height=100)
resized.to_file("thumbnail.jpg")
resize函数包含三个参数:method,width和height。分别代表压缩方式、图片宽度、图片高度。
method参数可以为以下三种模式:
scale:如果method参数设置为scale,则只需要提供width或者height其中的一个。服务器会根据原比例缩小图片。如果同时提供width和height将会报错。
fit:如果method参数设置为fit,则需要同时提供width和height以确定一个范围,缩小后的图片会保证尽量填充该区域。
cover:如果method参数设置为cover,缩小后的图片会填满width和height提供的区域,在必要的情况下服务器会根据一套算法保留他们认为的主要内容,其他部分会被裁剪。
如果目标尺寸大于原图尺寸,返回的图片并不会增大(官方解释是保证图片质量)。在method为scale模式或者fit模式且目标尺寸大于原尺寸的情况下,调用resize会增加API调用次数。如果使用scale模式则不会增加调用次数。
保留图片元数据
可以在图片下载之前调用preserve函数请求保留元数据,目前支持的元数据有:copyright(版权信息),location(拍摄地点GPS信息,仅JPEG支持)和creation(拍摄时间信息,仅JPEG支持)。请求保留元数据不会增加API调用次数。
source = tinify.from_file("large.jpg")
copyrighted = source.preserve("copyright", "creation")
copyrighted.to_file("optimized-copyright.jpg")
copyright信息会增加大约90字节,location信息增加大约130字节,creation信息增加大约70字节。
查看API调用次数
当验证了API key之后,可以通过tinify.compression_count
查看当月的API调用次数。
总结:该模块用于个人博客是一个不错的选择,服务器端的算法可以帮助我们筛选出最重要的图片信息,减轻图片重量。每个月500次的使用次数也足够个人使用了。如果有更频繁的API调用可以试试购买TinyPNG的API调用次数,价格还算公道。
感谢API及模块提供者