前言
在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用。而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存占用可以带来直接的效果。本文就简单介绍一张图片到底占用多少内存,我们先假设我们有一张图片时 600 * 800 的,图片占用空间大小假设是 100KB。
图片内存大小跟占用空间大小有什么关系?
占用空间的大小不是图片占用内存的大小,一些初学者可能会误解
- 占用空间:指磁盘上占用的空间
- 内存大小:指加载到内存中占用的内存大小
两个只是单位一样,本质上不是一个概念
一张图片到底占用多少内存呢?
- 图片占用内存的计算公式:图片高度*图片宽度*一个像素占用的内存大小
- 所以上面图片占用内存是:800*600*4byte=1875KB=1.83M
上面的计算公式中,为什么是4byte呢?
4byte是跟图片的编码格式有关系
- RGB888(int):R、G、B分量各占8位
- RGB565(short):R、G、B分量分别占5、6、5位
- RGB555(short):RGB分量都用5位表示(剩下的1位不用)
- ARGB8888(int):A、R、G、B分量各占8位
- ARGB4444(short):A、R、G、B分量各占4位
上面用ARGB8888格式时,一个int是32位,8位是1个字节,所以是4个字节
图片所在目录对内存的影响?
在Android中,图片的存放目录和手机的屏幕密度影响图片最终的大小,举个例子:
假设我们的图片放到xhdpi目录下,那么我们本文中的图片占用的内存大小如下:
屏幕密度为2的设备:800 * 600 * 4byte = 1.83M
屏幕密度为3的设备:800 * 1.5 * 600 * 1.5 * 4byte = 1.83 * 2.25M = 4.12M
所以,计算图片占用内存大小的时候,要考虑图片所在的目录跟设备密度,这两个因素其实影响的是图片的高宽,android会对图片进行拉升跟压缩。
|密度区间 | ldpi | mdpi | hdpi | xhdpi | xxhdpi | xxxhdpi |
| dpi | 120 | 160 | 240 | 320 | 480 | 640 |
| 1dp对应像素数| 0.75 | 1 | 1.5 | 2 | 3 | 4 |
上面的屏幕密度为3的设备中的1.5就是来源于1dp对应1.5个像素数
总结
-
图片确实很占用内存,内存优化先考虑图片内存占用;
-
一定要避免使用大图片,这就是.9图很有用的原因之一;
-
图片的大小对内存的影响是正比关系;
-
本文只是简单的告知读者怎么计算图片的内存大小。