Android中图片占用内存计算方法

Catalogue   

我们在电脑上看到的 png 格式或者 jpg 格式的图片,png(jpg) 只是这张图片的容器,它们是经过相对应的压缩算法将原图每个像素点信息转换用另一种数据格式表示,以此达到压缩目的,减少图片文件大小。而当我们通过代码,将这张图片加载进内存时,会先解析图片文件本身的数据格式,然后还原为位图,也就是 Bitmap 对象,Bitmap 的大小取决于像素点的数据格式以及分辨率两者。

结论:

  • 占用内存大小的计算公式:分辨率 * 像素点大小;Android中像素点大小有:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* 可用的bitmap配置, 一个bitmap配置描述的是每个像素的存储格式,这将会影响到图片的质量 (颜色深
* 度) 以及显示透明/半透明颜色的能力
*/
public enum Config {
// 这些枚举中的值必须要与Skia图像引擎的SkBitmap.h中对应值一一对应

/**
* 只有一个alpha通道
* 每个像素占1个字节
*/
ALPHA_8 (1),

/**
*每个像素占用2个字节,只有RGB 3个通道,没有alpha 通道
* 红色的精度是5 bits, 绿色精度是6 bits,蓝色精度是5
*/
RGB_565 (3),

/**
* 每个像素占用2个字节.
* (虽然占用内存只有 ARGB8888 的一半,不过已经被官方嫌弃)
*/
@Deprecated
ARGB_4444 (4),

/**
* 每个像素占用4个字节. 每个通道 (RGB的3个通道和alpha
* 的1个透明度通道) 的进度是8bit (256个可能值)
* 这种配置是最灵活的, 质量最好,尽量使用这种格式.
*/
ARGB_8888 (5);
}
  • 同一张图放在不同地方分辨率不一样,不同res目录占用内存大小不一样。本地磁盘、网络等按照原图的分辨率来计算;res目录中的图片,分辨率会进行转换,规则如下:

新分辨率=原图横向分辨率(设备dpi/目录对应的dpi)原图纵向分辨率*(设备的dpi/目录对应的dpi)

  • 优化内存的方法:

    • 设置像素点的使用方式,比如使用RGB_565
    • 降低分辨率inSampleSize

参考