Android一张图片占多少内存

图片内存大小和占用空间大小无关,与分辨率也就是手机上一个像素占用内存的大小有关

Posted by PanMin on February 2, 2018

前言

在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用。而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存占用可以带来直接的效果。本文就简单介绍一张图片到底占用多少内存,我们先假设我们有一张图片时 600 * 800 的,图片占用空间大小假设是 100KB。

图片内存大小跟占用空间大小有什么关系?

占用空间的大小不是图片占用内存的大小,一些初学者可能会误解

  • 占用空间:指磁盘上占用的空间
  • 内存大小:指加载到内存中占用的内存大小

两个只是单位一样,本质上不是一个概念

一张图片到底占用多少内存呢?

  1. 图片占用内存的计算公式:图片高度*图片宽度*一个像素占用的内存大小
  2. 所以上面图片占用内存是: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个像素数

总结

  1. 图片确实很占用内存,内存优化先考虑图片内存占用;

  2. 一定要避免使用大图片,这就是.9图很有用的原因之一;

  3. 图片的大小对内存的影响是正比关系;

  4. 本文只是简单的告知读者怎么计算图片的内存大小。