android bitmap(一) ARGB_8888/RGB_565/ALPHA_8/ARGB_4444

参考
(Bitmap)ARGB_8888/RGB_565/ALPHA_8/ARGB_4444详解
ALPHA_8、ARGB_4444、ARGB_8888、RGB_565等图片格式的使用说明

打开Android.graphics.Bitmap类里有一个内部类Bitmap.Config类,在Bitmap类里createBitmap(int width, int height, Bitmap.Config config)方法里会用到,打开个这个类一看

枚举变量
public static final Bitmap.Config ALPHA_8
public static final Bitmap.Config ARGB_4444
public static final Bitmap.Config ARGB_8888
public static final Bitmap.Config RGB_565

Bitmap.Config ARGB_4444:每个像素占四位,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位
Bitmap.Config ARGB_8888:每个像素占四位,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位
Bitmap.Config RGB_565:每个像素占四位,即R=5,G=6,B=5,没有透明度,那么一个像素点占5+6+5=16位
Bitmap.Config ALPHA_8:每个像素占四位,只保存透明度,不保存颜色。

一般情况下我们都是使用的ARGB_8888,由此可知它是最占内存的,因为一个像素占32位,8位=1字节,所以一个像素占4字节的内存。假设有一张480x800的图片,如果格式为ARGB_8888,那么将会占用1500KB的内存。

那么对bitmap有何影响?
这里都以ARGB_8888为基准来进行对比。
ARGB_4444:内存占用减少一半,但是每个值图片失真度很严重,这个参数本身已经不推荐使用了。
RGB_565:内存占用减少一半,舍弃了透明度,同时三色值也有部分损失,但是图片失真度很小。
ALPHA_8:内存占用没有减少!按注释的解释个人理解应该是减少3/4的内存占用,而且图片与ARGB_8888下的没有区别。
(ALPHA_8查到的资料不多,希望有高手可以帮我解惑)

总结:
由于ARGB_4444不推荐使用和ALPHA_8效果不明。我们大多数是用的还是ARGB_8888和RGB_565。
RGB_565能够在保证图片质量的情况下大大减少内存的开销,是解决oom的一种方法。但是一定要注意RGB_565是没有透明度的,如果图片本身需要保留透明度,那么就不能使用RGB_565。

在游戏应用中,要根据具体的使用要求来进行使用。例如一张地图,肯定不会出现空白透明的地方,所以可以选用不带alpha通道的格式。把地图,改成RGB_565这一类,没有透明度的图片,缩小了很多。而人物,肯定会有透明的地方。然后我们还有把一些后期功能,不重要的功能,例如一些小怪,压缩,从像素上压缩。还有图片重用,在这个副本是大boss,下一个副本是小怪。把60级以后的图片删除掉,玩家玩到某个节点的时候,就提示要求玩家点击下载新的包。或者在游戏过程中,也偷偷下载新的图片。

推荐阅读更多精彩内容