Android App加载图片内存空间计算
图片内存
图片占用内存空间大小都很熟悉:分辨率 * 像素点大小
图片占用内存空间大小和 图片分辨率,像素点大小 有关
1.图片格式,图片文件大小和占用内存空间大小无关
png / jpg 只是这张图片的容器,它们经过相对应的压缩算法将原图每个像素点信息转换用另一种数据格式表示,一次达到压缩目的,减少图片文件大小
无论png,jpg还是webp,都需要先转换为bitmap,然后才能显示
所以图片小打和图片加载进内存所占大小没关系;
2.图片占用内存空间大小和像素点数据格式相关
如没有指定,默认为ARGB_8888作为像素点的数据格式
图片的分辨率固定为:1080*452, 加载图片所占内存:1080 * 452 * 4B = 1952640B ≈ 1.86MB
数据格式 |
ALPHA_8 |
RGB_565 |
ARGB_4444 |
ARGB_8888 |
RGBA_F16 |
像素点 |
1B |
2B |
2B |
4B |
8B |
内存占用 |
0.47MB |
0.93MB |
0.94MB |
1.86MB |
3.72MB |
3.图片占用内存空间大小和加载view的大小无关
图片先加载内存,才会绘制到View上,图片申请内存时不知道要加载到哪里,除非提前告知,手动参与图片加载过程
4.图片放置res不同目录时,会影响图片占用内存空间大小
在不同的res目录中,当图片加载进内存时会经过一次分辨率转换再计算大小
设备dpi(240),图片分辨率1080*452,
新图高度 = 原图高度 * (设备dpi / 目录对应的dpi)
新图宽度 = 原图宽度 * (设备dpi / 目录对应的dpi)
故图片在xhdpi中转换后应该是:1080 * (240/320)* 452 * (240/320) * 4B = 1098360B ≈ 1.05MB
密度 |
ldpi |
mdpi |
hdpi |
xhdpi |
xxhdpi |
密度值 |
120 |
160 |
240 |
320 |
480 |
手机dpi240 |
7.45MB |
4.19MB |
1.86MB |
1.05MB |
0.47MB |
Mate30pro 410 |
21.74MB |
12.23MB |
5.43MB |
3.06MB |
1.36MB |
MI 10 Pro 396 |
20.28MB |
11.41MB |
5.07MB |
2.85MB |
1.27MB |
除了res下的图片,其他地方的图片都不会进行分辨率转换
5. 图片使用不同加载库,占用内存空间大小不同
如果使用了某个图片开源库,对于加载一张图片到内存占据多大空间,需要深入开源库研究
因为开源库会对图片进行优化处理;
图片内存优化
通过图片内存可了解图片占用内存大小和分辨率,像素点大小有关,故降低内存占用从图片本身考虑只能从两个方向入手:
① 减少每个像素点大小
这个好操作,系统默认以ARGB_8888格式进行处理,每个像素点占4B大小,可修改格式降低图片占用内存大小
② 降低分辨率
系统加载图片时,不以原图片分辨率,而是降低一定比例进行加载,可减少图片占用内存空间;
可通过BitmapFactory.Options.inSampleSize 降低分辨率,比如一张2000*1500的图片,设置inSampleSize为5后,
实际加载到内存中图片的宽高是400*300,内存占用从7.63M降至0.46M,节省十几倍;