美文网首页
如何获取Bitmap在内存中的大小

如何获取Bitmap在内存中的大小

作者: itbird01 | 来源:发表于2022-02-18 07:11 被阅读0次

Android中经常会使用Bitmap,对于开发者来说,可以很方便的调用getByteCount() or getAllocationByteCount()函数,可以获取到大小,但是您思考过几个问题吗?
1)一张100px*100px的图片在内存中会占用多大内存?
2)内存中如何计算的?
3)getAllocationByteCount 与 getByteCount有什么不同吗?

1.占了多大内存?

Android中一张图片(Bitmap)占用的内存主要和以下几个因数有关:图片长度、图片宽度、单位像素占用的字节数、图片的像素密度、屏幕的像素密度。
计算方法:一张图片(Bitmap)占用的内存=(图片长度*targetdensityDpi/densityDpi)*(图片宽度*targetdensityDpi/densityDpi)*单位像素占用的字节数
长度和宽度不用多做解释 ,单位是像素;关键是单位像素占用的字节数如何获得呢?
这里不得不提一下Bitmap创建的API

Bitmap bitmap = BitmapFactory.decodeResource(Resources res,int id,BitmapFactory.Options opts);

单位像素占用的字节数由其参数BitmapFactory.Options的inPreferredConfig变量决定,默认为Bitmap.Config.ARGB_8888,它是个枚举类型,它可以为以下值

命名 描述
ALPHA_8 此时图片只有alpha值,没有RGB值,一个像素占用1个字节
ARGB_4444 这种格式的图片,看起来质量太差,已经不推荐使用。一个像素占用2个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占4个bites,共16bites,即2个字节
ARGB_8888 一个像素占用4个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占8个bites,共32bites,即4个字节这是一种高质量的图片格式,电脑上普通采用的格式。它也是Android手机上一个BitMap的默认格式。
RGB_565 一个像素占用2个字节,没有alpha(A)值,即不支持透明和半透明,Red(R)值占5个bites ,Green(G)值占6个bites ,Blue(B)值占5个bites,共16bites,即2个字节.对于没有透明和半透明颜色的图片来说,该格式的图片能够达到比较的呈现效果,相对于ARGB_8888来说也能减少一半的内存开销。因此它是一个不错的选择。另外我们通过android.content.res.Resources来取得一个张图片时,它也是以该格式来构建BitMap的.从Android4.0开始,该选项无效。即使设置为该值,系统任然会采用 ARGB_8888来构造图片

所以一张100px*100px的图片在内存中占用的内存数为:

图片格式 计算公式 占用内存大小
ALPHA_8 100*100 10000b
ARGB_4444 1001002 20000b
ARGB_8888 1001004 40000b
RGB_565 1001002 20000b

targetdensityDpi是指手机每英寸所有的像素点(比如三星S6,那就是640),densityDpi是图片所处的资源文件夹(比如是xxh,那就是480)
这几个参数的的解析,大家可以看一下下面两篇文章
https://zhuanlan.zhihu.com/p/20732309
https://www.cnblogs.com/yaozhongxiao/archive/2014/07/14/3842908.html

2.getAllocationByteCount 与 getByteCount有什么不同吗?

getAllocationByteCount 获取的是bitmap所占用的内存的大小,getByteCount获取的是bitmap根据上面规则所计算出的大小,正常情况下,这两者是相同的。但是有一种情况是图片复用是会不一样

 //开启图片的内存复用
        options.inMutable=true;

如果一张bitmap加载开启这个option之后,代表内存可以复用,假设这张图片很大,那么下一张图片加载的时候,复用这块内存区域,就会造成getAllocationByteCount 与 getByteCount结果不同,因为前者返回的是bitmap所占用的实际内存的大小、后者返回的是图片的实际计算大小。

3.如何做好Bitmap的优化?

由上面的分析可从以下几点入手去优化Bitmap OOM相关问题:
1)大图小用,要记得抽样inSampleSize
2)小图大用,可以用矩阵Matrix
3)使用9.png代替其他图片
4)Bitmap如果经常同处加载,比如banner位置,可以考虑开启inMutable
5)想知道Bitmap实际宽和高,不必要加载到内存,可以通过inJustDecodeBounds,如果该 值设为true那么将不返回实际的bitmap,也不给其分配内存空间这样就避免内存溢出了。但是允许我们查询图片的信息这其中就包括图片大小信息
6)如果不需要透明度等信息时,使用RGB_565采样率
7)及时recycle

相关文章

网友评论

      本文标题:如何获取Bitmap在内存中的大小

      本文链接:https://www.haomeiwen.com/subject/lymslrtx.html