我相信大部分Android开发都知道在解析Bitmap到内存的时候都知道,需要设置inPreferredConfig来减少Bitmap占用的内存,那么配置inPreferredConfig这个属性真的能减少Bitmap占用的内存么?其实并不然,这个就是我们今天要讨论的东西。
大家都知道,Android中Bitmap占用的内存大小与两个因素相关:
1.Bitmap的宽高(和图片的像素,图片放置的位置,手机的内置的dpi相关)。
2.Bitmap.Config的设置(ALPHA_8,RGB_565,RGB_4444,RGB_8888)。
上述四个值的含义如下:
ALPHA_8:每个像素点仅表示alpha的值,它不会存储任何颜色信息,占8位。
RGB_565:每个像素用5位R/6位G/5位G来表示,占16位。
ARGB_8888:每个像素分别用8位存储ARGB,占32位
ARGB_4444:和8888类似,只不过对于每个通道是使用4位表示,占16位,因此它的图片质量比较低,已经不推荐使用了。
实验是检验真理的唯一标准,我们直接动手吧。
1.先拿一张png图片做测试
代码如下:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ALPHA_8;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher,options);
Log.v("MainActivity","width:"+bitmap.getWidth()+"height:"+bitmap.getHeight()+"size:"+bitmap.getByteCount());
BitmapFactory.Options options1 = new BitmapFactory.Options();
options1.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher,options1);
Log.v("MainActivity","width:"+bitmap1.getWidth()+"height:"+bitmap1.getHeight()+"size:"+bitmap1.getByteCount());
BitmapFactory.Options options2 = new BitmapFactory.Options();
options2.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher,options2);
Log.v("MainActivity","width:"+bitmap2.getWidth()+"height:"+bitmap2.getHeight()+"size:"+bitmap2.getByteCount());
这里我们不拿RGG_4444举例了,因为已经基本不用了,且设置它和设置RBG_565的内存占用是一样的。
打印输入如下:
我们可以发现,当我们需要解析的图片是png时,不管我们将inPreferredConfig属性值设置成什么
并不能改变我们Bitmap占用的内存。
2.拿一张JPG(24位,32位)图片做测试
下面我们将这张图片通过Photoshop将png图片转成jpg24位图片,同样使用上述代码,运行程序。
输出如下:
可以看到当我们图片是jpg的时候,将inPreferredConfig设置成RGB_565的时候,Bitmap的所占内存比设置成RGB_8888减少了一般的内存占用。但是设置ALPHA_8时,并没有减少内存的占用。
3.拿一张JPG(8位)图片做测试
我们把图片去除颜色信息变成黑白的图片的时候,当我们把inPreferredConfig设置成ALPHA_8,比设置成RGB_8888减少四分之三的内存,当把inPreferredConfig设置成RGB_565时,比设置成RGB_8888一半的内存。
总结:
可以看到,并不是每次通过设置inPreferredConfig都能减少我们Bitmap所占的内存。
当我们图片是png的时候,我们设置成什么都没用,当我们图片是jpg8位,24位,32位时,我们通过设置inPreferredConfig位RGB_565时,可以减少一半的内存占用。当我们解析的图片是jpg8位时,通过设置inPreferredConfig位ALPHA_8时可以减少四分之三的内存占用。
当我们不指定inPreferredConfig的值时,我们默认使用RGB_8888来解码,当指定了的inPreferredConfig值不满足时,例如png图片使用RGB_565来解码时,系统默认会选择RGB_8888来解码。