今天偶然发现了一个超级优秀的图片压缩工具TinyPNG,不但压缩率很高,而且效果也不错。

我从汽车之家随便下载了一个汽车的图片,压缩结果竟然有67%,从562.7 KB压缩到187.4 KB,而且效果也不错,虽然仔细看的话,有那么一点点模糊,但整体还是非常满意,文章后面会放出压缩前后对比。

status

更让我满意的是,它开放了客户端API接口,可以定制自己的压缩工具。

不过提供的API只是客户端使用,实际上还是将图片上传到TinyPNG的服务器上进行压缩,然后再将压缩后的图片下载下来。

要使用API,需要注册一个账号,获取API key,用于验证身份。

key

注册完才发现,没有免费的午餐,服务是要收费的,不过还算厚道,每月前500张免费,对个人来说够用了。

fee

我根据他们提供的Python API文档写了一个小工具,实现了:自动压缩指定目录下的所有.png/.jpg图片,压缩后的图片名是在原图片文件名的后面加上.c(src.png -> src.c.png)

代码如下:

# -*- coding: utf-8 -*-
import os
import fnmatch
import sys
import datetime
import tinify

if len(sys.argv) != 3:
	print("Usage: %s key src" % sys.argv[0])
	exit()

key = sys.argv[1]
src = sys.argv[2]

taskTimeStart = datetime.datetime.now()
print("Start compress photoes.\n\tkey:%s\n\tsrc:%s" % (key, src))

def compress(srcFile, destFile):
	timeStart = datetime.datetime.now()
	print("\n%s -> %s ..." % (srcFile, destFile))

	try:
		source = tinify.from_file(srcFile)
		source.to_file(destFile)

		timeUsed = datetime.datetime.now()-timeStart
		
		srcSize = os.path.getsize(srcFile)
		destSize = os.path.getsize(destFile)
		print("\tDone. Time %d.%ds, %dK->%dK(%d%%)" % (timeUsed.seconds, timeUsed.microseconds, srcSize/1000, destSize/1000, 100*(srcSize-destSize)/srcSize))

	except Exception, e:
		print("\tFailed: %s" % e)
		exit()


def allfiles(root, patterns="*"):
	patterns = patterns.split(";")
	for path, subdirs, files in os.walk(root):
		files.sort()
		
		for name in files:
			for pattern in patterns:
				if fnmatch.fnmatch(name, pattern):
					yield os.path.join(path, name)
					break

if __name__ == "__main__":
	try:
		tinify.key = key
		tinify.validate()
	except Exception, e:
		print("\tFailed: %s" % e)
		exit()

	for path in allfiles(src, "*.png;*.jpg"):
		r,ext = os.path.splitext(path)
		compress(path, r+".c"+ext)

	taskTimeUsed = datetime.datetime.now()-taskTimeStart
	print("\nTask done. Time %d.%ds" % (taskTimeUsed.seconds, taskTimeUsed.microseconds))
	print("Compressed used this month %d/500" % tinify.compression_count)

源代码我放到了Gist

执行结果如图:

result

压缩前后对比图(上:压缩前;下:压缩后):

before

after


ps. 安装方法:

$ git clone https://github.com/tinify/tinify-python.git
  • cd到tinify-python目录,进行安装
$ cd path-to-tinify-python
$ sudo python setup.py install
  • 安装完毕,可以使用上面写的那个小工具了