Bitmap占用内存大小的准确计算公式
Posted 小图包
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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_8888 | ARGB四个通道,每个通道8bit, 每个像素占4Byte |
RGB_565 | 每个像素占2Byte,其中红色占5bit,绿色占6bit,蓝色占5bit |
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 究竟占多大内存?
结合以上三篇文章,应该可以完全理解 Bitmap 占用内存大小 的 确切计算方式。
以上是关于Bitmap占用内存大小的准确计算公式的主要内容,如果未能解决你的问题,请参考以下文章
性能优化:Android中Bitmap内存大小优化的几种常见方式
ANDROID开发之OOM:一张图片(BitMap)占用内存的计算 图片内存优化