安卓图片内存优化(一)——图片占用内存大小的计算

来源:互联网 发布:淘宝被挤爆了图片 编辑:程序博客网 时间:2024/06/06 04:25

安卓开发中经常会遇到因为图片处理不当导致的oom问题,因为系统分配给每个应用的最大内存空间是有限的,正常只有几十上百兆(排除通过特殊手段获取到几百兆内存空间的情况)。所以为了节省更多的空间需要对图片进行内存优化。

对于很多初学者来说应该都会有这样的疑惑:
只是加载了一张几百k的图片而已,为什么也会导致oom的问题?

想知道问题的答案我们得弄明白图片在内存中占用的空间大小是如何计算的。

1. 图片相关的几个概念:

像素:

像素是组成图片的最基本单元要素。可以看做是一个点。

分辨率:

分辨率是指在长和宽上各拥有的像素个数
假如有张分辨率是1080*1920的图片,那它的宽度方向上有1080个像素点,高度方向上有1920个像素点,所以这张图片总共拥有2073600个像素点。

2. 图片占用内存大小的计算:

2.1 图片的载体

图片加载到内存后是以bitmap的形式存在的,所以bitmap占用内存空间大小,就是图片在内存中占用空间的大小。

2.2 bitmap占用内存空间的计算

bitmap的内存大小是以图片像素点总数乘以每个像素点所占的内存大小的结果。
所以图片占用内存的大小只跟图片分辨率和每个像素点占用的内存大小有关。

2.3 图片的色彩格式

bitmap的每个像素占用内存的大小跟色彩格式有关。
系统为我们提供了四种色彩格式:

ARGB_8888:占用4个字节,默认该格式显示

ARGB_4444:占用2个字节

RGB_565:占用2个字节

ALPHA:占用1个字节

如果按照默认色彩格式显示的话,那么一张分辨率是1080*1920的图片加载到内存后占用空间的大小是:
1080 * 1920 * 4=8294400 byte,换算成m的话就是大概8m的空间大小。
所以说一张本地的图片可能只有几十上百k但是加载到内存后就会占用好几兆的空间。图片占用内存的大小只跟该图片的分辨率有关,跟图片在本地占用空间的大小无关。一张几十兆的图片如果分辨率低,而一张几十k的图片如果分辨率高的话,加载这两张图片到内存后不做任何处理,那么占用内存的大小反而是几十k的比几十兆的大。

3. 总结

图片占用内存大小的两个关键因素:

1.图片的分辨率
2.采用的色彩格式

本地图片跟加载到内存后的图片占用空间的大小之所以会差别很大,原因是因为本地的图片正常都是经过一定压缩的,但是只是压缩图片质量而已,并不会改变分辨率。所以你把一张图片压缩后输出到本地,再把该图片和原图加载到内存后会发现两张图片占用的内存大小是一样的,因为两张图片的分辨率是一样的。

原创粉丝点击