Android之——图片的内存优化
转载请注明出处: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之——图片的内存优化的更多相关文章
- Android 中对于图片的内存优化方法
Android 中对于图片的内存优化方法,需要的朋友可以参考一下 1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFact ...
- Android中图片占用内存的计算
Android中图片占用内存的计算 原文链接 http://blog.sina.com.cn/s/blog_4e60b09d01016133.html 在Android开发中,我现在发现很多人还不 ...
- android 开发如何做内存优化
不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露.其实如果我 们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造 ...
- Android避免OOM(内存优化)
Android内存优化是性能优化很重要的一部分,而如何避免OOM又是内存优化的核心. Android内存管理机制 android官网有一篇文章 Android是如何管理应用的进程与内存分配 Andro ...
- (转)Android中图片占用内存计算
在Android开发中,我现在发现很多人还不会对图片占用内存进行很好的计算.因此撰写该博文来做介绍,期望达到抛砖引玉的作用. Android中一张图片(BitMap)占用的内存主要和以下几个因数有 ...
- Android 编程下图片的内存优化
1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFactory.decodeResource 来设置一张大图,因为这些方法在完成 ...
- Android大图片导致内存问题小结
在网上看了部分Android中OOM的问题,现在根据理解,做一下笔记. Android OOM 产生的几种原因 1. 程序中使用了太多自己创建的Bitmap. 这种情况通常是最好解决的. 因为你明白你 ...
- Android APP内存优化之图片优化
网上有很多大拿分享的关于Android性能优化的文章,主要是通过各种工具分析,使用合理的技巧优化APP的体验,提升APP的流畅度,但关于内存优化的文章很少有看到.在Android设备内存动不动就上G的 ...
- 【转】Android开发之Bitmap的内存优化详解
本文来源:转载自: http://mobile.51cto.com/abased-410796.htm 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitma ...
随机推荐
- Swift学习笔记(13)--属性 (Properties)
普通属性用var和let即可,本文不做详述 1.延迟存储属性 延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性.在属性声明前使用@lazy来标示一个延迟存储属性. class DataImp ...
- Java 实现策略(Strategy)模式
策略模式:行为型模式 将同一行为,不同的处理算法分别封装起来.让它们之间能够互相替换 1. 定义一个超类型接口,及 行为方法 2. 定义不同的实现类,实现该行为的 不同的算法 /** * 策略模式:针 ...
- headset-监听有线耳机插拔
今天在做项目的时候,需要对耳机的插拔事件进行监听,所以就写了如下的一个小demo,对耳机监听事件进行验证.直接看代码 package com.example.alert; import android ...
- js插件---10个免费开源的JS音乐播放器插件
js插件---10个免费开源的JS音乐播放器插件 一.总结 一句话总结:各种插件都有很多,多去找. 二.js插件---10个免费开源的JS音乐播放器插件 亲测可用 音乐播放器在网页设计中有时候会用到, ...
- php输出杨辉三角
php输出杨辉三角 一.截图 二.代码 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- vue methods 方法中 方法 调用 另一个方法。
vue在同一个组件内: methods中的一个方法调用methods中的另外一个方法. 可以在调用的时候 this.$options.methods.test(); this.$options.met ...
- 关于EM的理解
任意浏览器的默认字体高度16px(16像素). 所有未经调整的浏览器都符合: 1em=16px.那么12px=0.75em,10px=0.625em.为了简化font-size的换算,需要在css中的 ...
- VB&XML的增删改查
简介:XML的增删改查 开发过程中有许多后台操作XML的过程,每次需要操作时都是找很多代码来参考或者百度一下.今天决定补充下XML操作的知识,把XML操作的增删改查都写了一遍,供以后开发参考 查询: ...
- POJ 3040 贪心
贪心好题 ---. 思路: 从大到小凑C 如果不够 再从小到大补满(超过)C //By SiriusRen #include <cstdio> #include <cstring&g ...
- [论文笔记] CUDA Cuts: Fast Graph Cuts on the GPU
Paper:V. Vineet, P. J. Narayanan. CUDA cuts: Fast graph cuts on the GPU. In Proc. CVPR Workshop, 200 ...