Android中一张图片占据的内存大小是如何计算 (2)

图片就是上图那张:分辨率为 1080*452 的 png 格式的图片,图片文件本身大小 56KB

序号 前提 Bitmap内存大小
1   图片位于res/drawable,设备dpi=240,设备1dp=1.5px,控件宽高=50dp   4393440B(4.19MB)  
2   图片位于res/drawable,设备dpi=240,设备1dp=1.5px,控件宽高=500dp   4393440B(4.19MB)  
3   图片位于res/drawable-hdpi,设备dpi=240,设备1dp=1.5px   1952640B(1.86MB)  
4   图片位于res/drawable-xhdpi,设备dpi=240,设备1dp=1.5px   1098360B(1.05MB)  
5   图片位于res/drawable-xhdpi,设备dpi=160,设备1dp=1px   488160B(476.7KB)  
6   图片位于res/drawable-hdpi,设备dpi=160,设备1dp=1px   866880(846.5KB)  
7   图片位于res/drawable,设备dpi=160,设备1dp=1px   1952640B(1.86MB)  
8   图片位于磁盘中,设备dpi=160,设备1dp=1px   1952640B(1.86MB)  
9   图片位于磁盘中,设备dpi=240,设备1dp=1.5px   1952640B(1.86MB)  

看见没有,明明都是同一张图片,但在不同场景下,所占用的内存大小却是有可能不一样的,具体稍后分析。以上场景中列出了图片的不同来源,不同 Android 设备,显示控件的不同大小这几种考虑点下的场景。我们继续来看一种场景:同一张图片,保存成不同格式的文件(不是重命名,可借助ps);

图片:分辨率 1080*452 的 jpg 格式的图片,图片文件本身大小 85.2KB

ps:还是同样上面那张图片,只是通过 PhotoShop 存储为 jpg 格式

序号 前提 Bitmap内存大小 比较对象
10   图片位于res/drawable,设备dpi=240,设备1dp=1.5px   4393440B(4.19MB)   序号1  
11   图片位于res/drawable-hdpi,设备dpi=240,设备1dp=1.5px   1952640B(1.86MB)   序号3  
12   图片位于res/drawable-xhdpi,设备dpi=240,设备1dp=1.5px   1098360B(1.05MB)   序号4  
13   图片位于磁盘中,设备dpi=240,设备1dp=1.5px   1952640B(1.86MB)   序号9  

这里列出的几种场景,每个场景比较的实验对象序号也写在每行最后了,大伙可以自己比对确认一下,是不是发现,数据都是一样的,所以这里可以先得到一点结论:

图片的不同格式:png 或者 jpg 对于图片所占用的内存大小其实并没有影响

好了,我们开始来分析这些实验数据:

首先,如果按照图片大小的计算公式:分辨率 * 像素点大小

那么,这张图片的大小按照这个公式应该是:1080 * 452 * 4B = 1952640B ≈ 1.86MB

ps: 这里像素点大小以 4B 来计算是因为,当没有特别指定时,系统默认为 ARGB_8888 作为像素点的数据格式,其他的格式如下:

ALPHA_8 -- (1B)

RGB_565 -- (2B)

ARGB_4444 -- (2B)

ARGB_8888 -- (4B)

RGBA_F16 -- (8B)

上述实验中,按理就应该都是这个大小,那,为什么还会出现一些其他大小的数据呢?所以,具体我们就一条条来分析下:

分析点1

先看序号 1,2 的实验,这两者的区别仅在于图片显示的空间的大小上面。做这个测试是因为,有些人会认为,图片占据内存空间大小与图片在界面上显示的大小会有关系,显示控件越大占用内存越多。显然,这种理解是错误的。

想想,图片肯定是先加载进内存后,才绘制到控件上,那么当图片要申请内存空间时,它此时还不知道要显示的控件大小的,怎么可能控件的大小会影响到图片占用的内存空间呢,除非提前告知,手动参与图片加载过程。

分析点2

再来看看序号 2,3,4 的实验,这三个的区别,仅仅在于图片在 res 内的不同资源目录中。当图片放在 res 内的不同目录中时,为什么最终图片加载进内存所占据的大小会不一样呢?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydzsy.html