转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46972817

1. 对图片本身进行操作

尽量不要使用 setImageBitmap、setImageResource、 BitmapFactory.decodeResource 来设置一张大图,由于这些方法在完毕 decode 后,终于都是通过 Java 层的 createBitmap 来完毕的,须要消耗很多其它内存。因此。改用先通过 BitmapFactory.decodeStream 方法。创建出一个 bitmap,再将其设为
ImageView 的 source。decodeStream 最大的秘密在于其直接调用 JNI>>nativeDecodeAsset() 来完毕 decode。无需再使用 Java 层的 createBitmap。从而节省了 Java 层的空间。

假设在读取时加上图片的 Config 參数,能够更有效的降低载入的内存,从而更有效阻止抛出内存异常。另外。decodeStream 直接拿图片来读取字节码了,不会依据机器的各种分辨率来自己主动适应。使用了 decodeStream 之后。须要在 hdpi 和 mdpi,ldpi
中配置对应的图片资源, 否则在不同分辨率机器上都是相同大小(像素点数量)。显示出来的大小就不正确了。

InputStream is = this.getResources().openRawResource(R.drawable.pic);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 2;
Bitmap btp =BitmapFactory.decodeStream(is,null,options);

以上代码即是读取 drawable 下名为 pic 图片的缩略图。长度、宽度都仅仅有原图片的 1/2。图片大小降低,占用的内存自然也变小了。这么做的弊端是图片质量变差。inSampleSize 的值越大。图片的质量就越差。因为各手机厂商缩放图片的算法不同。在不同手机上的缩放图片质量可能会不同。

2. 调用图片的 recycle() 方法

if(!bmp.isRecycle() ){
bmp.recycle() // 回收图片所占的内存
system.gc() // 提醒系统及时回收
}

这样的方法事实上不是真正减少图片内存的方法。主要目的是标记图片对象,方便回收图片对象的本地数据。

图片对象的本地数据占用的内存最大,并且与程序 Java 部分的内存是分开计算的。所以常常出现 Java heap 足够使用。而图片发生 OutOfMemoryError 的情况。在图片不使用时调用该方法,能够有效减少图片本地数据的峰值,从而减少 OutOfMemoryError
的概率。只是调用了 recycle() 的图片对象处于“废弃”状态,调用时会造成程序错误。所以在无法保证该图片对象绝对不会被再次调用的情况下。不建议使用该方法。

特别要注意已经用 setImageBitmap(Bitmap

img) 方法分配给控件的图片对象。可能会被系统类库调用。造成程序错误。

3. 以最省内存的方式读取本地资源的图片

/**
* 以最省内存的方式读取本地资源的图片
*/
public static Bitmap readBitMap(Context context, int resId){
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
// 获取资源图片
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is,null,opt);
}

Android 中载入图片的颜色模式有四种。各自是:ALPHA_8:每一个像素占用 1byte 内存、ARGB_4444:每一个像素占用 2byte 内存、ARGB_8888:每一个像素占用 4byte 内存、RGB_565:每一个像素占用 2byte 内存。Android默认的颜色模式为ARGB_8888。这个颜色模式色彩最细腻,显示质量最高。但相同的。占用的内存也最大。

以上代码即是将图片资源以
RGB_565 (或以 ARGB_4444)模式读出。内存降低尽管不如第一种方法明显,可是对于大多数图片,看不出与 ARGB_8888 模式有什么区别。只是在读取有渐变效果的图片时,可能有颜色条出现。

另外,会影响图片的特效处理。

4. 使用 Matrix 对象放大的图片怎样更改颜色模式:

尽管使用 Matrix 对象放大图片。必然会耗费很多其它的内存。但有时候也不得不这样做。

放大后的图片使用的 ARGB_8888 颜色模式,就算原图片是ARGB_4444 颜色模式也一样。并且没有办法在放大时直接指定颜色模式。能够採用下面办法更改图片颜色模式。

Matrix matrix = new Matrix();
float newWidth = 200; // 图片放大后的宽度
float newHeight = 300; // 图片放大后的长度
matrix.postScale(newWidth / img.getWidth(), newHeight/ img.getHeight());
Bitmap img1 = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true);// 得到放大图片
img2 = img1.copy(Bitmap.Config.ARGB_4444, false); // 得到 ARGB_4444 颜色模式的图片
img = null;
img1 = null;

这里比起本来的图片额外生成了一个图片对象 img1。

然则体系会主动收受接管 img1,所以实际内存还是削减了。

归结起来还是以缩略图模式读取图片和削减图片中每一个像素占用的内存最为有效。

这两种办法固然有效,然则也有各自的弊病。实际开辟中还是应当依照景象酌情应用。

最王道的办法,还是避免垃圾对象的产生。

比如在 ListView 的应用中,复用 convertView 等。若是应用 AsyncTask 载入图片,要及时将引用的 ImageView 对象置为 null。由于 AsyncTask
是用线程池实现的,所以此中引用的对象可能会拥有非常长的生命周期,造成 GC 无法开释。我还是信赖 Android 的内存收受接管机制的。recycle 什么的固然必定程度上有效。但总感觉不合适 Java 内存收受接管的原则。

Android之——图片的内存优化的更多相关文章

  1. Android 中对于图片的内存优化方法

    Android 中对于图片的内存优化方法,需要的朋友可以参考一下     1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFact ...

  2. Android中图片占用内存的计算

    Android中图片占用内存的计算 原文链接 http://blog.sina.com.cn/s/blog_4e60b09d01016133.html   在Android开发中,我现在发现很多人还不 ...

  3. android 开发如何做内存优化

    不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露.其实如果我 们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造 ...

  4. Android避免OOM(内存优化)

    Android内存优化是性能优化很重要的一部分,而如何避免OOM又是内存优化的核心. Android内存管理机制 android官网有一篇文章 Android是如何管理应用的进程与内存分配 Andro ...

  5. (转)Android中图片占用内存计算

    在Android开发中,我现在发现很多人还不会对图片占用内存进行很好的计算.因此撰写该博文来做介绍,期望达到抛砖引玉的作用.   Android中一张图片(BitMap)占用的内存主要和以下几个因数有 ...

  6. Android 编程下图片的内存优化

    1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFactory.decodeResource 来设置一张大图,因为这些方法在完成 ...

  7. Android大图片导致内存问题小结

    在网上看了部分Android中OOM的问题,现在根据理解,做一下笔记. Android OOM 产生的几种原因 1. 程序中使用了太多自己创建的Bitmap. 这种情况通常是最好解决的. 因为你明白你 ...

  8. Android APP内存优化之图片优化

    网上有很多大拿分享的关于Android性能优化的文章,主要是通过各种工具分析,使用合理的技巧优化APP的体验,提升APP的流畅度,但关于内存优化的文章很少有看到.在Android设备内存动不动就上G的 ...

  9. 【转】Android开发之Bitmap的内存优化详解

    本文来源:转载自: http://mobile.51cto.com/abased-410796.htm 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitma ...

随机推荐

  1. @Mapper注解在springboot中无法注入

    问题① @Mapper注解报红无法注入 方法 在pom文件中添加依赖

  2. Linux 下查看某进程的线程数

    1.查看文件 /proc/${pid}/status2.pstree -p ${pid}3.输入 top -bH -d 3 -p ${pid}top -H手册中说:-H : Threads toggl ...

  3. ArcGIS Engine中添加点、线、面元素

    转自原文 ArcGIS Engine中添加点.线.面元素 此种方式为IElement的方式在axMapControl的GraphicsContainer中好绘制图形. //画点 IPoint pt = ...

  4. [Python] isinstance() for checking object type

    isinstance("foo", str) isinstance(1, int) isinstance(4.0, float)

  5. UML图和C#

        这段时间学习了楚光明老师解说的C#视频,接触这个学习材料的第一感觉就是老师解说的通俗易懂,非常easy让人去接受:再有就是在学习到UML图和C#的一节时非常有收获,之前自己也学习过UML图的一 ...

  6. SpringBoot与Dubbo的整合-zookeeper和监控中心搭建

    对于Dubbo的应用已经是十分普遍,自从阿里巴巴开源以来,国内许多公司就采用了dubbo的架构来开发项目.不过再dubbo十分火的时候,突然就停止更新了, 只有当当网还在其基础进行了拓展(dubbox ...

  7. js --- 递归结构图

    // 用递归 来求 5 的阶乘 // n! = n * (n-1)! // 定义一个函数,用于求 n 的阶乘 function func(n) { ) { ; } // func(n-1) 因为传递的 ...

  8. kafka自带没web ui界面,怎么办?安装个第三方的

    见 基于Web的Kafka管理器工具之Kafka-manager的编译部署详细安装 (支持kafka0.8.0.9和0.10以后版本)(图文详解)(默认端口或任意自定义端口)  

  9. Spark Tachyon实战应用(配置启动环境、运行spark和运行mapreduce)

    Tachyon实战应用 配置及启动环境 修改spark-env.sh 启动HDFS 启动Tachyon Tachyon上运行Spark 添加core-site.xml 启动Spark集群 读取文件并保 ...

  10. 关于SQL分页存储过程的分析

    建 立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅 ...