Bitmap占用内存大小的准确计算公式

一、已经持有了Bitmap对象,怎么知道它占用的内存大小

  bitmap类本身 就有这个方法, bitmap.getByteCount()就行。它内部是计算方式:  每一行的字节大小  * 总行数(即高度) 

android.graphics.Bitmap.java 源码

public final int getByteCount() {
        if (mRecycled) {
            Log.w(TAG, "Called getByteCount() on a recycle()'d bitmap! "
                    + "This is undefined behavior!");
            return 0;
        }
        // int result permits bitmaps up to 46,340 x 46,340
        return getRowBytes() * getHeight();
    }

二、没有持有Bitamp对象,如何确定drawable资源中的 png占用多少内存

1、 Bitmap格式对单个像素所占内存大小的影响

格式描述
ALPHA_8只有一个alpha通道,每个像素1Byte
ARGB_4444这个从API 13开始不建议使用,因为质量太差,每个像素占2Byte
ARGB_8888ARGB四个通道,每个通道8bit, 每个像素占4Byte
RGB_565每个像素占2Byte,其中红色占5bit,绿色占6bit,蓝色占5bit

 

2、确定两个常量值(名称不太准确,原谅一下)

inDensity:原始资源的 density。这个值跟这张图片的放置的目录有关(比如 hdpi 是240,xxhdpi 是480)

inTargetDensity 就是手机屏幕的 density。

 

3、计算方式

scaledWidth = int( 图片的像素宽 *inTargetDensity / inDensity + 0.5) 

scaledHeight = int(图片的像素高 *inTargetDensity / inDensity + 0.5)

占用内存大小= scaledWidth * scaledHeight * 单个像素所占内存的大小  。    单位:字节(Byte)

注意:图片的像素宽 * inTargetDensity / inDensity  这个结果 是个 floats 类型, 需要进行四舍五入。 

 

我们通常的理解方式是 直接 拿图片的宽乘以高,再乘以当前Bitmap格式下单个像素占用的内存大小 。  这种算法忽视了两点:

 

1、设备本身会对存放在类似drawable-xxhdpi...... 等这种目录下的图片进行缩放, 这个缩放规则是常识了,不知道的自己去百度查。所以这里需要拿图片的原始宽高进行缩放计算

 

2、如果考虑到第1点,最后计算的出来bitmap占用内存大小与 bitmap.getByteCount()有微小的差异。  这个差异 就是因为 “图片的像素宽 * inTargetDensity / inDensity”  这样计算的结果是float 类型, 而图片的像素个数必须是 整数。 所以这里有一个 四舍五入的过程,  误差来源于这里

 

参考1:Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存?

参考2:Bitmap 比你想的更费内存 | 吊打 OOM

参考3:Android开发之高效加载Bitmap

 

结合以上三篇文章,应该可以完全理解 Bitmap 占用内存大小 的 确切计算方式。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值