做者 | 王亚军 编辑 | 宋秉金git
王亚军,腾讯工程师,负责OMG无线新闻、腾讯视频图片服务等的业务运维工做。github
谷歌大神又出开源新技术啦,此次是对JPEG格式的图片采用全新算法从新编码,输出的图片仍是JPEG可是图片大小明显缩小,而质量不但没有损失,甚至还更加优化,速速来体验一把。算法
下载谷歌开源软件,编译安装之后其实是一个bin工具。输入图片,输出jpeg格式图片。windows
文档下面有写Ubuntu、Arch Linux、windows、macOS的安装方式。咱们以 Ubuntu 系统为例,介绍如何安装 guetzli。工具
首先,克隆谷歌的项目文件:测试
git clone https://github.com/google/guetzli.git
而后,安装 libpng 软件包:优化
sudo apt-get install libpng-dev cd guetzli
而后直接 make
,生成bin文件,强大的开源工具 ./bin/Release/guetzli
因而就生成了。google
guetzli的使用比较简单,参数不多。默认采用95的质量,也能够经过 -quality
来指定大于等于84的质量,若是要小于84,须要修改源码。输入必须是符合转换要求的图片,输出则是jpeg格式图片。
官方说明:
Only YUV color space input jpeg is supported
实测发现,使用透明通道的png图、非YUV的jpeg好比黑白图、gif图都是不能转换的。
批量实测1292张图片。使用默认参数,也就是原图的95%质量。
1185张转换成功,占比91.7%,其中3张png转换jpeg之后图片比原图更大,占比0.2%。107张没法转换,占比8.3%。
原图平均大小33KB,guetzli压缩后23.4KB,平均压缩率29%,平均每张耗时7956毫秒。
单张最大的图片3.76MB,guetzli压缩后2.55MB,压缩率31.5%,耗时976949毫秒(16分钟)。
单张最小的图片757B,guetzli压缩后603B,压缩率20%,耗时65毫秒。
另外借用国外媒体报道中使用的对比图片,直观地感觉下压缩后的效果:
左边是原图,中间是 libjpeg 压缩后,右边是使用 guetzli 压缩后。
官方文档说,1MPIX的图片处理须要消耗300M内存。
实测一个1MB大小1920x2560的图片,有4.9MPIX。理论消耗内存1474MB,实际消耗1009MB内存,实际与理论基本相符。由此看出这个工具是个内存消耗大户,60G内存只够处理200MPIX,也就是同时处理40张左右的1920x2560图片。
CPU消耗则一直是100%单核占用。固然实际使用多核机器能够同时跑多个进程。有多少核就能跑多少个guetzli任务。
压缩图片耗时跟图片大小程离散相关,图片越大,耗时越久:
测试环境使用的是8核16G内存的机器。单核平均处理23KB的图片须要约8秒钟,这个耗时比较长,注定没法进行在线实时压缩。
实测对质量在90或如下的jpg图片,guetzli输出的新图质量不会下降。而实际压缩率可以达到平均压缩率29%。
兼容性比较好,输出的jpeg格式图片通用性很是高。没有webp、sharpp那种协议不兼容的困扰。
在客户端jpeg格式的图片编解码速度比其余私有协议快不少。
guetzli处理类型局限性,并不能应对所有类型的图片。只能处理YUV颜色编码的图片。
时效性较差,图片越大处理越慢。1MB的图片处理须要291秒,本次测试平均23KB的图片须要8秒。