Bitmap占用内存大小的准确计算公式
2017-08-29 17:52
274 查看
参考1:https://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=403263974&idx=1&sn=b0315addbc47f3c38e65d9c633a12cd6&scene=0#wechat_redirect
参考2:
https://mp.weixin.qq.com/s?__biz=MzIxNjc0ODExMA==&mid=2247484679&idx=1&sn=d738f5ec092c8490484b66cb1ab80eab&chksm=97851c26a0f29530c2359cec1bbe74d93b90e4a1ba8df751dd6469734c8e58280fb265442d0c&scene=21#wechat_redirect
参考3:http://www.jianshu.com/p/a45d79a6ba02
结合以上三篇文章,应该可以完全理解 Bitmap 占用内存大小 的 确切计算方式。
1、 Bitmap格式对单个像素所占内存大小的影响
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 类型, 而图片的像素个数必须是 整数。 所以这里有一个 四舍五入的过程, 误差来源于这里
参考2:
https://mp.weixin.qq.com/s?__biz=MzIxNjc0ODExMA==&mid=2247484679&idx=1&sn=d738f5ec092c8490484b66cb1ab80eab&chksm=97851c26a0f29530c2359cec1bbe74d93b90e4a1ba8df751dd6469734c8e58280fb265442d0c&scene=21#wechat_redirect
参考3:http://www.jianshu.com/p/a45d79a6ba02
结合以上三篇文章,应该可以完全理解 Bitmap 占用内存大小 的 确切计算方式。
1、 Bitmap格式对单个像素所占内存大小的影响
格式 | 描述 |
ALPHA_8 | 只有一个alpha通道,每个像素1Byte |
ARGB_4444 | 这个从API 13开始不建议使用,因为质量太差,每个像素占2Byte |
ARGB_8888 | ARGB四个通道,每个通道8bit, 每个像素占4Byte |
RGB_565 | 每个像素占2Byte,其中红色占5bit,绿色占6bit,蓝色占5bit |
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 类型, 而图片的像素个数必须是 整数。 所以这里有一个 四舍五入的过程, 误差来源于这里
相关文章推荐
- Android Bitmap占用内存计算公式
- 计算bitmap占用内存大小
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C/C++--类占用内存的大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算(转载)
- java计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- Android 一张图片(BitMap)占用内存的计算 图片内存优化
- java对象占用内存大小计算方式
- [置顶] C/C++中结构体占用内存大小的计算方法
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- bitmap占用内存大小
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- Java计算一个对象占用内存的大小
- android 获取Bitmap位图所占用的内存大小
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- bitmap占用内存大小总结