`
java-mans
  • 浏览: 11420509 次
文章分类
社区版块
存档分类
最新评论

Android中图片占用内存的计算

 
阅读更多

本人的网易博客原文

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

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 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的
: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()可以立即释放Native内存

通过dumpsys meminfo命令可以查看一个进程的内存使用情况,
当然也可以通过它来观察我们创建或销毁一张BitMap图片内存的变化,从而推断出图片占用内存的大小。
示例adb shell"dumpsysmeminfocom.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中如何查看内存


分享到:
评论

相关推荐

    Android中一张图片占用的内存大小

    最近面试过程中发现对Android中一些知识有些模棱两可,之前总是看别人的总结,自己没去实践过,这两天对个别问题进行专门研究 探讨:如何计算Android中一张图片占据内存的大小 解释:此处说的占据内存,是APP加载...

    android中图片加载到内存的实例代码

    主要介绍了android中图片加载到内存的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    Android获取第三方应用的占用大小,包括缓存、数据、应用大小

    Android通过IPackageStatsObserver.aidl 、PackageStats.aidl两个AIDL文件获取第三方应用的占用大小,包括缓存、数据、应用大小,经验证和手机设置里面显示的大小完全一致。。。。。。如果还需要其他比如清除缓存之...

    android内存监测之procrank

    android内存监测之procrank Android系统中提供了两个命令行工具procrank、procmem用于查看系统中的内存使用情况。这两个工具对于我们分析...procrank可以查看系统中所有进程的整体内存占用情况,并按照规则排序。

    android内存监测之procmem

    Android系统中提供了两个命令行工具procrank、procmem用于查看系统中的内存使用情况。这两个工具对于我们分析内存相关问题非常有效。由于Android系统使用的是Linux内核,理论上这样的工具可以在Linux上运行。本质上...

    Android图片压缩以及优化实例

    如果图片要显示下Android设备上,ImageView最终是要加载Bitmap对象的,就要考虑单个Bitmap对象的内存占用了,如何计算一张图片的加载到内存的占用呢?其实就是所有像素的内存占用总和: bitmap内存大小 = 图片长度 ...

    Android 实现加载大图片的方法

    项目简介: 该项目为加载大图片 详细介绍: 对于超大的图片,如果不缩放的话,容易导致内存溢出。而经过处理后,无论多大的... 2).Android中保存图片是用ARGB保存的,A表示阿尔法透明度,所以一个像素点占用了4个字节

    Android实现图片压缩(bitmap的六种压缩方式)

    Android中图片是以bitmap形式存在的,那么bitmap所占内存,直接影响到了应用所占内存大小,首先要知道bitmap所占内存大小计算方式: 图片长度 x 图片宽度 x 一个像素点占用的字节数 以下是图片的压缩格式: 其中,A...

    Android 中使用svg图片

     为什么用svg,现在手机的短板是内存,不是cpu,svg通过cpu计算,png占用内存  Android上对svg进行阉割,使用Vector Drawable对svg支持,svg小 2. svg语法:   Vector 语法简介,如何看懂一张svg  (1)Path指令解析...

    新版Android开发教程.rar

    � 采用了对有限内存、电池和 CPU 优化过的虚拟机 Dalvik , Android 的运行速度比想象的要快很多。 � 运营商(中国移动等)的大力支持,产业链条的热捧。 � 良好的盈利模式( 3/7 开),产业链条的各方:运营商、...

    一起动手编写Android图片加载框架

    开发一个简洁而实用的Android图片加载缓存框架,并在内存占用与加载图片所需时间这两个方面与主流图片加载框架之一Universal Image Loader做出比较,来帮助我们量化这个框架的性能。通过开发这个框架,我们可以...

    基于android的视频播放器---开题报告.doc

    于是各种手机播放器也紧跟着发展起来,但是很多播放器一味追求外" "观花哨,功能庞大,对用户的手机造成了很多资源浪费,比如CPU,内存等的占用 " "率过高,在用户需要多任务操作时,受到了不小的影响,带来了许多...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    目前市场业务中在产品以及其他项目的认证和检测方面存在诸多不便,用户需要实地考察并频繁与检测单位沟通,填写繁琐的纸质检测报告、当面送递样品,对于检测环节中存在的问题难以及时交互并处理。市场上相应的检测...

    金山 Office 安卓版 WPS Office for Android 12.9.1 中文免费版.zip

    具有内存占用低、运行速度快、体积小巧、强大插件平台支持、免费提供海量在线存储空间及文档模板、支持阅读和输出PDF文件、全面兼容微软 Office 97-2010 格式(doc/docx/xls/xlsx/ppt/pptx等)独特优势。 WPS ...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--android中anim文件特效 |--app信息menifest获取(如版本号) |--AsyncQueryHandler之异步查询Cursor处理 |--AutoCompleteTextView自动提示的用法 |--BitMap、Drawable、inputStream及byte[] 互转 |--...

    如何用Android Studio创建一个C语言项目并学习开发C语言和汇编语言.zip

    - **紧凑的代码**:汇编程序生成的目标代码通常比高级语言编译后的代码更为紧凑,占用内存较少。 - **快速执行**:由于直接对应于机器指令,汇编程序在执行时无需经过复杂的解释或编译过程,能够快速、高效地被...

    钉头锤:MACE是针对移动异构计算平台优化的深度学习推理框架

    移动AI计算引擎(简称MACE )是针对Android,iOS,Linux和Windows设备上的移动异构计算而优化的深度学习推理框架。 该设计着重于以下目标: 性能 使用NEON,OpenCL和Hexagon对运行时进行了优化,并引入了以加快...

    安卓软件开发--毕业设计开题报告安卓软件文献翻译.docx

    式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。 安卓软件开发--毕业设计开题报告安卓软件文献翻译全文共4页,当前为第2页。 安卓软件开发--毕业设计开题报告安卓软件文献...

    为了面试收集的一些java和安卓的知识点

    内存泄露的根本原因:长生命周期的对象持有短生命...处理:避免在UI线程,BroadcastReceiver 还有service主线程中,处理复杂的逻辑和计算 layout_gravity和gravity的区别: layout_gravity:设置控件本身相对于父控件

    MightyText - 来自PC的短信和来自计算机的文本「MightyText - SMS from PC & Text from Computer」-crx插件

    - 减少了内存占用 5.0(2011年9月3日) - 主要的速度提高 4.6(2011年8月11日) - 改善加载标签的速度 - 修复了“你有很多短信”通知的间歇性问题 - 背景颜色的变化,基于许多用户的反馈:) 4.4(2011年8月3日)...

Global site tag (gtag.js) - Google Analytics