Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

Bitmap加载内存分析

MirkoWug 2022-06-23 23:29:38 阅读数:0 评论数:0 点赞数:0 收藏数:0

一、Bitmap内存

1.Bitmap内存的计算方式

1.decodeResource 从drawable、mipmap这种对应的文件目录中加载图片
Bitamp 占用内存大小 = 宽度像素 x (inTargetDensity / inDensity) x 高度像素 x (inTargetDensity / inDensity)x 一个像素所占的内存
inTargetDensity :设备的dpi
inDensity :当前文件所在drawable文件夹目录 对应的dpi
在这里插入图片描述
一个像素所占的内存,有以下几种像素格式:

ALPHA_8 1byte
ARGB_4444 2byte
ARGB_8888 4byte
RGB_565 2byte

2.从本地磁盘 、asset、等方式中加载图片
Bitamp 占用内存大小 = 宽度像素 x 高度像素 x 一个像素所占的内存

注意:当使用第三方库时,则不能用这些公式来计算,因为三方库内部会重新对内存进行优化。
eg:
fresco:不管图片来源是哪里,即使是 res,图片占用的内存大小仍旧以原图的分辨率计算。
Glide:如果有设置图片显示的控件,那么会自动按照控件的大小,降低图片的分辨率加载。图片来源是 res 的分辨率转换规则对它也无效。

注意:Bitmap的内存大小 和像素大小是不一样的。
内存大小= 像素大小(即图片宽 x 高)x 一个像素所占内存

二、影响内存的二个因素

1、图片分辨率,也就是图片尺寸
2、像素点所占内存大小,对应4种像素格式

所以我在做内存优化时,可以从这二方面来入手:
1.减小图片的尺寸
2.调整为占用内存更小的像素格式。
实际开发中,我们更倾向第一种,因为修改像素格式,会导致图片质量下降,导致失真。
而对第一种,可以参考 Luban

三、结论

  1. 图片来源是 res 内的不同资源目录时,系统会根据设备当前的 dpi 值以及资源目录所对应的 dpi 值,做一次分辨率转换,规则如下:新分辨率 = 原图横向分辨率 * (设备的 dpi / 目录对应的 dpi ) * 原图纵向分辨率 * (设备的 dpi / 目录对应的 dpi )。
  2. 其他图片的来源,如磁盘,文件,流等,均按照原图的分辨率来进行计算图片的内存大小。
  3. jpg、png 只是图片的容器,图片文件本身的存储大小与它所占用的内存大小没有什么关系。

参考

1.Bitmap分析
2.https://www.cnblogs.com/dasusu/p/9789389.html
3.Bitmap分析

版权声明
本文为[MirkoWug]所创,转载请带上原文链接,感谢
https://blog.csdn.net/MirkoWug/article/details/125413481