写在前面
Android开发中的图像压缩是一个很重要的部分。而这篇文章会让我们从另外一个角度来认识Android平台下的图像压缩和优化。
这篇文章更适合和设计师一起来看,所以,如果你和你的设计师是好基友的话,不妨叫上他,倒两杯咖啡,花上几分钟...
...
...
其实主要有部分图像专业处理上相关的知识,笔者并没有去深入介绍(能力有限),所以有设计师的帮助会让你了解的更透彻。
简介
日常我们在Android开发中接触到的图像,主要有以下四种格式:
1.png2. VectorDrawable
Android 平台的矢量图形 。
本文所说的图像压缩就是关于以上这四种格式
关于PNG图像的压缩
PNG图像是Android开发中使用的比较广泛的,而它的压缩和优化的方式也相应比较多。
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文件添加一行配置:
5.png4. 通过代码来代替PNG图
假设你有一个圆形的图像需要展示很用户,如果使用PNG图片的话:
如果你通过代码画出来:
7.png没有对比,就没有伤害。
5. 矢量图代替PNG图
8.png关于VectorDrawable
VectorDrawable(矢量图形)是Android官方推出一个新的特性,为我们提供了添加复杂矢量图形的强大功能,同时也提供了动画显示这些图形的方法。矢量图形的好处是放大不会失真,可以适应不同分辨率的屏幕。所以,它是你图像压缩和优化的首选,尽可能的去使用吧。
关于VectorDrawable的介绍和使用,这里不做过多的介绍。
关于JPG图像的压缩
当谈到关于JPG的图像的时候,官方视频中的讲解者Colt McAnlis如是说到:
9.png
JPG相对于PNG格式的图像,更加复杂,所以一般不推荐直接使用JPG图像。关于JPG图像的压缩方式有以下几种:
1. 降低JPG图像的质量
10.png 11.png以上两张图片,通过将图片的质量降低,图片大小由263k减少到25k,压缩的非常可观,当然并不是所有的JPG图像都适用这种降低质量的方式,因为首先,你需要在保证在不影响人肉眼观看的效果的前提下,再去降低图像的质量。
但是,这里会出现一个问题,如果你有很多张这样的图片,然后你手动的一个个通过比对去降低,这样的效率会非常低下。所以官方视频中为这种方式提供了一个图像质量适用规则:
12.png2. JPG 压缩优化工具
同样的,网上关于JPG图像的一些压缩优化工具也很多,你可以Google搜索下JPG Optimizer
13.png关于WebP
最后
如果你觉得以上内容太多,记不住的话, 没关系,官方视频为我们提供一张总结图:
14.png简单来说,从图像压缩和优化的角度来看的话,当你在选择图像的时候,应当考虑的优先级如下:
VectorDrawable>WebP>PNG>JPG
另:因为本文涉及到很多有关图像相关的专业知识,如果有错误的地方,欢迎指出 :)