现在的位置: 首页 > 综合 > 正文

Android中图片占用内存的计算

2014年02月19日 ⁄ 综合 ⁄ 共 2901字 ⁄ 字号 评论关闭
Android中一张图片(BitMap)占用的内存主要和以下几个因数有关:图片长度,图片宽度,单位像素占用的字节数。
一张图片(BitMap)占用的内存=图片长度*图片宽度*单位像素占用的字节数
图片长度和图片宽度的单位是像素。
图片(BitMap)占用的内存应该和屏幕密度(Density)无关,虽然我暂时还拿不出直接证据。
   创建一个BitMap时,其单位像素占用的字节数由其参数BitmapFactory.OptionsinPreferredConfig变量决定。
inPreferredConfig为Bitmap.Config类型,
Bitmap.Config是个枚举类型,它可以为以下值
Enum Values
Bitmap.Config  ALPHA_8  Each pixel is stored as a single translucency (alpha) channel. 
This is very useful to efficiently store masks for instance.
No color information is stored. With this configuration,
each pixel requires 1 byte of memory.
此时图片只有alpha值,没有RGB值,一个像素占用一个字节
Bitmap.Config  ARGB_4444  This field is deprecated. Because of the
 poor quality of this configuration,
 it is advised to use ARGB_8888instead. 
 
这种格式的图片,看起来质量太差,已经不推荐使用。
Each pixel is stored on 2 bytes.
The three RGB color channels
 and the alpha channel (translucency) are stored with
 a 4 bits precision (16 possible values.)
This configuration is mostly useful if the application needs to
 store translucency information but also needs to save memory.
It is recommended to use ARGB_8888
 instead of this configuration.
一个像素占用2个字节,alpha(A)值,Red(R)值,Green(G)值,
Blue(B)值各占4个bites,共16bites,即2个字节
Bitmap.Config  ARGB_8888  Each pixel is stored on 4 bytes.
 Each channel (RGB and alpha for translucency) is stored with
 8 bits of precision (256 possible values.)
This configuration is very flexible and offers the best quality.
It should be used whenever possible
一个像素占用4个字节,alpha(A)值,Red(R)值,
Green(G)值,Blue(B)值各占8个bites,共32bites,即4个字节

这是一种高质量的图片格式,电脑上普通采用的格式。
它也是Android手机上一个BitMap的
默认格式。
Bitmap.Config  RGB_565  Each pixel is stored on 2 bytes and only
 the RGB channels are encoded:
red is stored with 5 bits of precision (32 possible values),
green is stored with 6 bits of precision (64 possible values)
and blue is stored with 5 bits of precision.
 This configuration can produce slight visual artifacts
depending on the configuration of the source.
 For instance, without dithering,
the result might show a greenish tint.
To get better results dithering should be applied.
This configuration may be useful
when using opaque bitmaps
that do not require high color fidelity.
一个像素占用2个字节,没有alpha(A)值,即不支持透明和半透明,
Red(R)值
占5个bites ,Green(G)值占6个bites  
Blue(B)值占5个bites,共16bites,即2个字节.
对于没有
透明和半透明颜色的图片来说,
该格式的图片能够达到比较的呈现效果,
相对于ARGB_8888来说也能减少一半的内存开销。
因此它是一个不错的选择。
另外我们通过
android.content.res.Resources
来取得一个张图片时,它也是以该格式来构建BitMap的
Android4.0开始,该选项无效。即使设置为该值,
系统任然会采用 ARGB_8888来构造图片
:ARGB指的是一种色彩模式,里面A代表Alpha,R表示redG表示greenB表示blue,其实所有的可见色都是红绿蓝组成的,所以红绿蓝又称为三原色。
A  R  G  B
透明度 红色 绿色 蓝色
简单点说

 图片格式(Bitmap.Config

 占用内存的计算方向

 一张100*100的图片占用内存的大小

 ALPHA_8

 图片长度*图片宽度

 100*100=10000字节

 ARGB_4444

 图片长度*图片宽度*2

 100*100*2=20000字节

 ARGB_8888

 图片长度*图片宽度*4

 100*100*4=40000字节

 RGB_565 

 图片长度*图片宽度*2

 100*100*2=20000字节


另外,需要注意这里的图片占用内存是指在Navtive中占用的内存,当然BitMap使用的绝大多数内存就是该内存。
因为我们可以简单的认为它就是BitMap所占用的内存。
  Bitmap对象在不使用时,我们应该先调用recycle(),然后才它设置为null.
虽然Bitmap在被回收时可以通过BitmapFinalizer来回收内存。但是调用recycle()是一个良好的习惯
在Android4.0之前,Bitmap的内存是分配在Native堆中,调用recycle()可以立即释放Native内存。
从Android4.0开始,Bitmap的内存就是分配在dalvik堆中,即JAVA堆中的,调用recycle()并不能立即释放Native内存。但是调用recycle()也是一个良好的习惯。
转载:http://blog.sina.com.cn/s/blog_4e60b09d01016133.html

抱歉!评论已关闭.