转载请注明出处: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. php,javascript设置和读取cookie

    1.php设置cookie setcookie($name,$value,expire,path,domain,secrue); //$name:指的是cookie的名字:$value指的是cooki ...

  2. 洛谷 P1718 图形复原

    P1718 图形复原 题目描述 HWX小朋友对几何的热爱在电脑组是出了名的,号称“每题必解”,这天,LXC在玩logo的时候突然想到了一个题目,刚好可以去测试一下他封号的虚实,于是,他logo编程画了 ...

  3. SQL char字段类型排序

    我是做的ACCESS时候需要对字段的值进行排序,字段格式是char类型的,但是存的值是数字.现在需要对该字段进行排序. 通过查找,找到以下两种方法,记录下来. 1. 你可以转换成int型再排序 sel ...

  4. [ES2017] Iterate over properties of an object with ES2017 Object.entries()

    The Object.entries() function is an addition to the ECMAscript scpec in Es2017. This allows us to it ...

  5. (诡异Floyd&自环)MZ Training 2014 #15 E题(POJ 2240)

    你们见过这么诡异的FLOYD吗? 先上题. [Description] 货币的汇率存在差异.比如,如果1美元购买0.5英镑,1英镑买10法郎.而1法国法郎买0.21美元.然后,通过转换货币,一个聪明的 ...

  6. 从头认识Spring-2.4 基于java的标准注解装配-@Inject(2)-通过set方法或者其它方法注入

    这一章节我们来讨论一下基于java的标准注解装配标签@Inject是如何通过通过set方法或者其它方法注入? 在使用@Inject标签之前.我们须要在pom文件中面增加以下的代码: <depen ...

  7. 查看activity task相关信息

    可以使用命令 adb shell dumpsys activity 查看的结果如下 ACTIVITY MANAGER PENDING INTENTS (dumpsys activity intents ...

  8. 浏览器下管理Linux系统--记webmin的使用

    本文介绍一款浏览器方式来管理linux的一种方式,这款软件就叫webmin,Webmin 让您能够在远程使用支持 HTTPS (SSL 上的 HTTP)协议的 Web 浏览器通过 Web 界面管理您的 ...

  9. 【深入篇】Android常用布局方式简介

    LinearLayout 线性布局是程序中最常见的布局方式.一般分为水平线性布局和竖直线性布局,通过android.orientation属性可以设置线性布局的方向. 在布局中操作颜色时,要用的是十六 ...

  10. spark源码阅读

    根据spark2.2的编译顺序来确定源码阅读顺序,只阅读核心的基本部分. 1.common目录 ①Tags②Sketch③Networking④Shuffle Streaming Service⑤Un ...