关于Android应用中图片占用内存浅谈
从事过移动端应用开发的童鞋应该都清楚,内存是非常宝贵的资源。如果能很好的利用有限的内存,对应用性能的提升会有很大的帮助。在实际应用开发中图片内存占整个应用非常大的比重,我们只有了解图片是如何加载到内存中,才能更好的优化图片所占的内存。
那么对于图片在Android应用中的使用进行探讨一下。
图片所占内存大小=内存中图片高 * 内存中图片宽 * 每个像素所占字节数
1,那么图片的物理高宽和加载到内存中的高宽是否是一样的呢?
在应用中关于图片的加载一般分为两种情况,其加载到内存中的大小也是不一样的:
第一种,图片资源放在drawable或mipmap中,通过R.drawable.*或者R.mipmap.*的方式读取。这类多半是应用的切图文件等;
第二中,非通过R文件获取的图片资源。例如存放在sd文件中或者网络中等;
对于第一种情况,是由系统通过当前设备的density来选择读取对于density目录下的图片资源,资源的匹配是由对应的density目录开始检索,如果对应目录没有则到比当前density小的目录中寻找,只到找到图片为止。
| 属性名 | ldpi | mdpi | hdpi | xhdpi | xxhdpi | xxxhdpi |
| 目录对应DPI | 120 | 160 | 240 | 320 | 480 | 640 |
这类加载方式图片在内存中的大小计算公式如下:
内存中长度 =( 图片真实长度 / 图片所在目录DPI) * 设备DPI
例如:图片的真实高度是192px,图片资源放在xhdpi目录中,测试的设备DPI=560 那么加载到内存中的高度= (192 / 320) * 480 =288
对应第二种情况,是由开发者直接指定图片资源的地址,系统不会对图片进行处理:
内存中长度= 图片真实长度
2,像素所占字节数是如何计算的呢?
关于这个问题官网中给了很明确的解释,是通过Bitmap.Config来决定的

android系统中默认的bitmap.Config是 Bitmap.Config.ARGB_8888 所以每个像素占4个字节
那我们来验证下上面所说的是否正确:在hdpi,xhdpi,xxhdpi,xxxhdpi已经sdcard中使用同一张图片大小为192px*192px.
测试的设备为:1080*1920 density=3.0 DPI=480

由上图可以看到,不同的目录图片所对应的内存大小
sdcard: 高宽= 192px 内存=192*192*4 = 144kb
hdpi : 高宽 = (192 /240 )*480=384px 384*384*4=576kb
xhdpi: 高宽 = (192/320)*480=288px 288*288*4=324kb
xxhdpi: 高宽 = (192/480)*480 = 192px 192*192*4=144kb
xxxhdpi: 高宽 = (192/640)*480 = 144px 144*144*4=81kb
为了验证在实际运行中图片所在内存是否符合我们的计算公式,我们可以利用AS的监控功能dump出运行时的dump文件进行分析验证。


通过验证可以得知图片所占的内存大小符合前面的公式:192*192*4=147456B
最后对在应用中使用图片的有些建议:
1,切图资源不能随便乱放文件夹,最好按照对应的切图放到对应的文件家中,避免因为访问其他文件加导致图片所占内存增大。
2,对于只有一套切图资源来说,尽量选择高精度的尺寸切图。参考当前主流设备的设备信息选择对应的精度作为切图标准。目前我以xxhdpi作为切图标准
3,对应非同R文件引用的图片,可以选择设置Bitmap.Config属性控制图片内存大小,可以选择Bitmap.Config.RGB_565的方式,相比默认的Bitmap.Config.ARGB_8888将会减少一半的内存占用
关于Android应用中图片占用内存浅谈的更多相关文章
- Android中图片占用内存的计算
Android中图片占用内存的计算 原文链接 http://blog.sina.com.cn/s/blog_4e60b09d01016133.html 在Android开发中,我现在发现很多人还不 ...
- (转)Android中图片占用内存计算
在Android开发中,我现在发现很多人还不会对图片占用内存进行很好的计算.因此撰写该博文来做介绍,期望达到抛砖引玉的作用. Android中一张图片(BitMap)占用的内存主要和以下几个因数有 ...
- android上的图片占用内存问题
近日正在把ios程序移植到android上,以前没做过android的程序,于是,想当然地把ios的图片资源放到了android工程的drawable文件夹下,这些图片都是png. 程序界面也很正常. ...
- android 图片占用内存与什么有关
android 图片占用内存与什么有关 原文链接:http://blog.csdn.net/zjl5211314/article/details/7041813 在开发手机应用的时候,内存是有限的,那 ...
- 图片--Android加载图片导致内存溢出(Out of Memory异常)
Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证) ...
- Android加载图片导致内存溢出(Out of Memory异常)
Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证) ...
- Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8 (转)
Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8http://www.crifan.com/android_emulator_ ...
- 【已解决】Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8
[问题] 折腾: [已解决]Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8 过程中,增大对应AVD的内存为2G后,结果无法启 ...
- 【已解决】Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory
[已解决]Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 结论是: 当前有个bug: 默认是通过 hw.ramSize=1024 ...
随机推荐
- IOS 当一个控件被添加到父控件中会调用(didMoveToSuperview)
/** * 当一个控件被添加到父控件中就会调用 */ - (void)didMoveToSuperview { if (self.group.opened) { self.nameView.image ...
- 漫谈 Clustering (番外篇): Vector Quantization
在接下去说其他的聚类算法之前,让我们先插进来说一说一个有点跑题的东西:Vector Quantization.这项技术广泛地用在信号处理以及数据压缩等领域.事实上,在 JPEG 和 MPEG-4 等多 ...
- Github的基本功能
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Fadeoc Khaos链接:http://www.zhihu.com/question/20070065/answer/30 ...
- js实现指定日期增加指定月份
首先,大致思路为: 1. 先将字符串格式的时间类型转化为Date类型 2. 再将Date类型的时间增加指定月份 3. 最后将Date类型的时间在转化为字符串类型 1. 先将字符串格式的时间类型转化为 ...
- java设计模式——单例模式(一)
一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...
- 防止sql注入方法 如何防止java中将MySQL的数据库验证密码加上 ' or '1'= '1 就可以出现万能密码 的PreparedStatement
package com.swift; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar ...
- 第28题:leetcode101:Symmetric Tree对称的二叉树
给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,nul ...
- FILE对象线程安全
根据apue讲述: 标准的IO例程可能从它们各自的内部数据结构的角度出发,是以线程安全的方式实现的!但在线程中,如果标准 IO例程都获取它们各自的锁,那么在做一次一个字符的IO时就会出现严重的性能下降 ...
- 配置vim nginx.conf高亮
#!/bin/bashwget http://www.vim.org/scripts/download_script.php?src_id=14376 -O nginx.vimmv nginx.vim ...
- php订单号的生成
来自ECSHOP订单号生成函数:/includes/lib_order.php文件中的get_order_sn() /** * 得到新订单号 * @return string */ function ...