通过设置不同的inPreferredConfig值真的能减少Bitmap加载时占用的内存么?

我相信大部分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来解码。

在Android开发中,处理大尺寸图片常遇到内存溢出问题。推荐资料《Android通过URI获取与压缩Bitmap避免OOM》能够帮助我们了解如何在获取图片进行有效压缩。以下是解决方案的具体步骤: 参考资源链接:[Android通过URI获取与压缩Bitmap避免OOM](https://wenku.youkuaiyun.com/doc/6401abb9cce7214c316e9443?spm=1055.2569.3001.10343) 1. 首先,我们需要确定图片的原始尺寸。这可以通过设置`BitmapFactory.Options`的`inJustDecodeBounds`属性为`true`,然后使用`BitmapFactory.decodeStream()`方法进行解码,而不分配内存空间给图片。这样我们就能获取到图片的宽度和高度信息。 2. 接着,我们根据目标图片的尺寸,计算出一个合适的缩放比例(`inSampleSize`)。这个比例决定了我们将图片缩小到多少分之一的尺寸。计算公式通常是目标宽度除以原始宽度与目标高度除以原始高度中的较大者。 3. 然后,我们重新设置`BitmapFactory.Options`,将`inJustDecodeBounds`设置为`false`,并使用计算出的`inSampleSize`进行图片解码。我们还可以设置`inPreferredConfig`为`Bitmap.Config.RGB_565`,以减少每像素所占的字节数,从而进一步减少内存使用。 4. 最后,通过`ContentResolver.openInputStream(uri)`获取图片的输入流,并使用`BitmapFactory.decodeStream()`进行解码,得到最终的压缩过的Bitmap对象。 这样处理后,我们可以将大图片压缩到合适的尺寸,避免了直接解码导致的内存溢出问题。在实际开发中,调用这一方法通常在`onActivityResult()`中完成,以获取用户通过图库选择的图片URI,并对其进行压缩处理。 通过这种方式,我们可以确保图片在加载不会占用过多内存,从而避免OOM异常,同还能保证图片的质量满足界面显示的需求。如果你希望深入了解Android中Bitmap加载内存管理,建议深入阅读《Android通过URI获取与压缩Bitmap避免OOM》这份资料,它将为你提供更多的信息和技巧,帮助你更好地处理这类问题。 参考资源链接:[Android通过URI获取与压缩Bitmap避免OOM](https://wenku.youkuaiyun.com/doc/6401abb9cce7214c316e9443?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值