Android中图片占用内存的计算

本人的网易博客原文

在Android开发中,我现在发现很多人还不会对图片占用内存进行很好的计算。因此撰写该博文来做介绍,期望达到抛砖引玉的作用。

Android中一张图片(BitMap)占用的内存主要和以下几个因数有关:图片长度,图片宽度,单位像素占用的字节数。
一张图片(BitMap)占用的 内存 = 图片长度*图片宽度*单位 像素占用的字节数
图片长度和 图片宽度的单位是像素。
图片(BitMap)占用的内存应该和屏幕密度(Density)无关,虽然我暂时还拿不出直接证据。
创建一个BitMap时,其单位像素占用的字节数由其参数 BitmapFactory.Options inPreferredConfig 变量决定。
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 useARGB_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的
:A RGB指的是一种色彩模式,里面A代表Alpha, R 表示 red G 表示 green B 表示 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()可以立即释放 Native内存

通过dumpsys meminfo命令可以查看一个进程的内存使用情况,
当然也可以通过它来观察我们创建或销毁一张BitMap图片内存的变化,从而推断出图片占用内存的大小。
示例 adb shell " dumpsys meminfo com.lenovo.robin "
运行结果。
Applications Memory Usage (kB):
Uptime: 18696550 Realtime: 18696541
** MEMINFO in pid 7985 [com.lenovo.robin] **
native dalvik other total
size: 4828 5379 N/A 10207
allocated: 4073 2852 N/A 6925
free: 10 2527 N/A 2537
(Pss): 608 317 1603 2528
(shared dirty): 2240 1896 6056 10192
(priv dirty): 548 36 1276 1860

Objects
Views: 0 ViewRoots: 0
AppContexts: 0 Activities: 0
Assets: 2 AssetManagers: 2
Local Binders: 5 Proxy Binders: 11
Death Recipients: 1
OpenSSL Sockets: 0

SQL

heap: 0 MEMORY_USED: 0
PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0
关于内存统计的更多内容请参考《 Android中如何查看内存


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值