图片就是上图那张:分辨率为 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 内的不同目录中时,为什么最终图片加载进内存所占据的大小会不一样呢?