Android开发中的图像压缩是一个很重要的部分。而这篇文章会让咱们从另一个角度来认识Android平台下的图像压缩和优化。android
这篇文章更适合和设计师一块儿来看,因此,若是你和你的设计师是好基友的话,不妨叫上他,倒两杯咖啡,花上几分钟...
...
...
其实主要有部分图像专业处理上相关的知识,笔者并无去深刻介绍(能力有限),因此有设计师的帮助会让你了解的更透彻。git
平常咱们在Android开发中接触到的图像,主要有如下四种格式:github
1. PNG
PNG的名称来源于“可移植网络图形格式(Portable Network Graphic Format,PNG)”,PNG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,而且还可存储多到16位的α通道数据。PNG使用从LZ77派生的无损数据压缩算法,通常应用于JAVA程序、网页或S60程序中,缘由是它压缩比高,生成文件体积小。算法
2. VectorDrawable
Android 平台的矢量图形 。性能优化
3. JPG
JPG全名是JPEG。JPEG图片以 24 位颜色存储单个位图。JPEG 是与平台无关的格式,支持最高级别的压缩,不过,这种压缩是有损耗的。渐近式 JPEG 文件支持交错。服务器
4. WebP格式
谷歌(Google)开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器带宽资源和数据空间。Facebook Ebay等知名网站已经开始测试并使用WebP格式。网络
本文所说的图像压缩就是关于以上这四种格式less
PNG图像是Android开发中使用的比较普遍的,而它的压缩和优化的方式也相应比较多。svg
1. AAPT
aapt全称Android Asset Packaging Tool,直译的话,就是Android资源打包工具,这是Android官方提供的一个打包工具,而它在将咱们的Android项目打包成apk的过程当中,已经自动帮咱们完成了一次对于PNG图片的压缩处理,有兴趣的同窗,能够将Android项目源码中的资源图片与apk中解压出来的资源图片的大小对比一下,你会发现apk中的图片会比咱们源码中的图片要小,我相信不少小伙伴都没有注意到这一点吧 :)工具
而在官方视频中的介绍,aapt工具对于图像压缩只作了三件事:specifically , no more , no less
简单来讲的话就是对图像进行了二次处理,以下图所示:
2. 下降图像色彩位数
若是你的图像文件的色彩比较单一,那么你能够经过下降图像的位数来进行压缩,以下图所示:
注意:下降色彩位数的前提是,并不会影响用户对图像的观看。
3. PNG 压缩优化工具
网上有不少关于PNG格式的压缩优化工具,你能够到Google上搜索 PNG Optimizer ,会出来不少相关的资料。
另外Google官方也有一个开源的项目Zopfli,是deflate压缩算法的另外一种实现。
这里须要注意的是,有时候经过其余工具压缩后的PNG图像,再通过aapt工具的压缩,恩,那应该会更小?
WTF !!!
别急,这里须要对Gradle文件添加一行配置:
这里推荐一个插件img-optimizer-gradle-plugin,一款用于优化png图片的gradle插件,有效减小APK体积,支持极限压缩和无损压缩。
4. 经过代码来代替PNG图
假设你有一个圆形的图像须要展现很用户,若是使用PNG图片的话:
若是你经过代码画出来:
没有对比,就没有伤害。
5. 矢量图代替PNG图
关于用矢量图去代替PNG,官方视频中介绍了一个位图转换为矢量图的工具Potrace 。
矢量图一样也能够再通过处理转换成VectorDrawable格式,而size会进一步变小。这里有一个开源库svg2android,能够将svg转换为VectorDrawable 。
VectorDrawable(矢量图形)是Android官方推出一个新的特性,为咱们提供了添加复杂矢量图形的强大功能,同时也提供了动画显示这些图形的方法。矢量图形的好处是放大不会失真,能够适应不一样分辨率的屏幕。因此,它是你图像压缩和优化的首选,尽量的去使用吧。
关于VectorDrawable的介绍和使用,这里不作过多的介绍。
当谈到关于JPG的图像的时候,官方视频中的讲解者Colt McAnlis如是说到:
By the way ,Colt McAnlis的视频讲解很是富有激情,也很幽默,我我的比较喜欢他。Google 官方的Android Performance Patterns(性能优化视频)合集中有不少是由他来说解的,因此强烈推荐有兴趣的同窗去看看。
JPG相对于PNG格式的图像,更加复杂,因此通常不推荐直接使用JPG图像。关于JPG图像的压缩方式有如下几种:
1. 下降JPG图像的质量
以上两张图片,经过将图片的质量下降,图片大小由263k减小到25k,压缩的很是可观,固然并非全部的JPG图像都适用这种下降质量的方式,由于首先,你须要在保证在不影响人肉眼观看的效果的前提下,再去下降图像的质量。
可是,这里会出现一个问题,若是你有不少张这样的图片,而后你手动的一个个经过比对去下降,这样的效率会很是低下。因此官方视频中为这种方式提供了一个图像质量适用规则:
2. JPG 压缩优化工具
一样的,网上关于JPG图像的一些压缩优化工具也不少,你能够Google搜索下JPG Optimizer
谷歌(Google)开发的一种旨在加快图片加载速度的图片格式,因此,强烈推荐使用WebP图像来替换PNG和JPG图像。
另外推荐一个开源库WebpifyYourAndroidApp,能够将PNG或者JPG转换为WebP图像。
若是你以为以上内容太多,记不住的话, 不要紧,官方视频为咱们提供一张总结图:
简单来讲,从图像压缩和优化的角度来看的话,当你在选择图像的时候,应当考虑的优先级以下:
VectorDrawable>WebP>PNG>JPG
另:由于本文涉及到不少有关图像相关的专业知识,若是有错误的地方,欢迎指出 :)