转载请注明出处: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. 学习TF:《TensorFlow实战》中文版PDF+源代码

    深度学习乃至人工智能正逐渐在FinTech领域发挥巨大的作用,其应用包括自动报告生成.金融智能搜索.量化交易和智能投顾.而TensorFlow为金融业方便地使用深度学习提供了可能.<Tensor ...

  2. 利用js 获取ip和地址

    1.引用第三方js<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> 2.     I ...

  3. 几种类型的db,以及最新的db排名,看一下

    5月数据库排名: http://geek.csdn.net/news/detail/196118 另外这篇文章里面提到了一些内嵌式数据库: http://blog.csdn.net/leagoal/a ...

  4. Android 4.4 Fence在SurfaceFlinger中的应用

    网上关于android.fence的资料好少啊.差点儿没有,可是这个机制又在GUI系统中起着关键的数据,于是自己通读源代码和凝视.与大家分享下Fence究竟是怎么回事? Fence即栅栏.栅栏的角色与 ...

  5. hdu1856 More is better (并查集)

    More is better Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 327680/102400 K (Java/Others) ...

  6. RvmTranslator6.5 is released

    RvmTranslator6.5 is released eryar@163.com RvmTranslator can translate the RVM file exported by AVEV ...

  7. OpenCV —— 视频播放控制

    创建滚动条,实现滚动条随视频播放移动. #include "cv.h" #include "highgui.h" CvCapture* capture=NULL ...

  8. SASS常用方法

    cnpm install --save-dev sass-loader //sass-loader依赖于node-sass cnpm install --save-dev node-sass //实现 ...

  9. 通过 chroot 重新设置 root 密码

    实例:通过 chroot 重新设置 root 密码 忘记了 root 密码该怎么办?接下来的 demo 将演示如何通过 chroot 命令重新设置 centos7 中被忘记了的 root 密码.sys ...

  10. 【Python学习】爬虫报错处理bs4.FeatureNotFound

    [BUG回顾] 在学习Python爬虫时,运Pycharm中的文件出现了这样的报错: bs4.FeatureNotFound: Couldn’t find a tree builder with th ...