android内存优化之图片优化_Android

对图片本身进行操作。尽量不要使用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中配置相应的图片资源,否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。

复制代码 代码如下:

InputStreamis=this.getResources().openRawResource(R.drawable.pic1);
BitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inJustDecodeBounds=false;
options.inSampleSize=10;//width,hight设为原来的十分一
Bitmapbtp=BitmapFactory.decodeStream(is,null,options);

复制代码 代码如下:

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

复制代码 代码如下:

/**
*以最省内存的方式读取本地资源的图片
*@paramcontext
*@paramresId
*@return
*/
publicstaticBitmapreadBitMap(Contextcontext,intresId){
BitmapFactory.Optionsopt=newBitmapFactory.Options();
opt.inPreferredConfig=Bitmap.Config.RGB_565;
opt.inPurgeable=true;
opt.inInputShareable=true;
//获取资源图片
InputStreamis=context.getResources().openRawResource(resId);
returnBitmapFactory.decodeStream(is,null,opt);
}

option中的值指的是,图片进行缩放的比例,SDK中建议其值是2的指数值,值越大会导致图片不清晰。长度、宽度都只有原图片的1/2。图片大小减少,占用的内存自然也变小了。这么做的弊端是图片质量变差,inSampleSize的值越大,图片的质量就越差。由于各手机厂商缩放图片的算法不同,在不同手机上的缩放图片质量可能会不同。笔者就遭遇过moto手机上图片缩放后质量可以接受,三星手机上同样的缩放比例,质量却差很多的情况。

Android中有四种,分别是
ALPHA_8:每个像素占用1byte内存
ARGB_4444:每个像素占用2byte内存
ARGB_8888:每个像素占用4byte内存
RGB_565:每个像素占用2byte内存
Android默认的颜色模式为ARGB_8888,这个颜色模式色彩最细腻,显示质量最高。但同样的,占用的内存也最大。
以上代码即是将1.png以ARGB_4444模式读出。内存减少虽然不如第一种方法明显,但是对于大多数图片,看不出与ARGB_8888模式有什么差别。不过在读取有渐变效果的图片时,可能有颜色条出现。另外,会影响图片的特效处理。
优化Dalvik虚拟机的堆内存分配。对于Android平台来说,其托管层使用的DalvikJavaVM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。使用方法:

复制代码 代码如下:

privatefinalstaticfloatTARGET_HEAP_UTILIZATION=0.75f;
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);

即可。
还有就是可以定义堆内存的大小。

复制代码 代码如下:

privatefinalstaticintCWJ_HEAP_SIZE=6*1024*1024;VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);//设置最小heap内存为6MB大小

调用图片的recycle()方法:
这个其实不是真正降低图片内存的方法。主要目的是标记图片对象,方便回收图片对象的本地数据。图片对象的本地数据占用的内存最大,而且与程序Java部分的内存是分开计算的。所以经常出现Javaheap足够使用,而图片发生OutOfMemoryError的情况。在图片不使用时调用该方法,可以有效降低图片本地数据的峰值,从而减少OutOfMemoryError的概率。不过调用了recycle()的图片对象处于“废弃”状态,调用时会造成程序错误。所以在无法保证该图片对象绝对不会被再次调用的情况下,不建议使用该方法。特别要注意已经用setImageBitmap(Bitmapimg)方法分配给控件的图片对象,可能会被系统类库调用,造成程序错误。

使用Matrix对象放大的图片如何更改颜色模式
虽然使用Matrix对象放大图片,必定会耗费更多的内存,但有时候也不得不这样做。放大后的图片使用的ARGB_8888颜色模式,就算原图片是ARGB_4444颜色模式也一样,而且没有办法在放大时直接指定颜色模式。可以采用以下办法更改图片颜色模式。
代码如下

复制代码 代码如下:

Matrixmatrix=newMatrix();
floatnewWidth=200;//图片放大后的宽度
floatnewHeight=300;//图片放大后的长度
matrix.postScale(newWidth/img.getWidth(),newHeight/img.getHeight());
Bitmapimg1=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,所以实际内存还是减少了。

时间: 2024-11-01 23:59:12

android内存优化之图片优化_Android的相关文章

总结Android App内存优化之图片优化_Android

前言 在Android设备内存动不动就上G的情况下,的确没有必要去太在意APP对Android系统内存的消耗,但在实际工作中我做的是教育类的小学APP,APP中的按钮.背景.动画变换基本上全是图片,在2K屏上(分辨率2048*1536)一张背景图片就会占用内存12M,来回切换几次内存占用就会增涨到上百兆,为了在不影响APP的视觉效果的前提下,有必要通过各种手段来降低APP对内存的消耗. 通过DDMS的APP内存占用查看工具分析发现,APP中占用内存最多的是图片,每个Activity中图片占用内存

总结Android App内存优化之图片优化

前言 在Android设备内存动不动就上G的情况下,的确没有必要去太在意APP对Android系统内存的消耗,但在实际工作中我做的是教育类的小学APP,APP中的按钮.背景.动画变换基本上全是图片,在2K屏上(分辨率2048*1536)一张背景图片就会占用内存12M,来回切换几次内存占用就会增涨到上百兆,为了在不影响APP的视觉效果的前提下,有必要通过各种手段来降低APP对内存的消耗. 通过DDMS的APP内存占用查看工具分析发现,APP中占用内存最多的是图片,每个Activity中图片占用内存

网站SEO优化之图片优化技巧分享

对于许多网站来说,都没有去刻意的去优化它的图片的,如果大家知道,许多网站,它的图片流量点到了总流量的百分之十的时候,我想大部分人还是还会注意到图片的优化效果的,其实这是一个事实,许多大型的网站,图片流量基本上都快达到了这个百分比,这是一个不小的数据,而且相对于网页优化来说,图片优化要相对简单得多了,它需要的资源也没有网页多,所以它的性价比还是比较高的,那么究竟要怎么去优化网站的图片呢? 1.为每一张重要的图片都单独的建立一个网页,建立一个图片频道 在这一点上梦芭莎是有做图片频道的,细心的朋友会发

旅游类网站的优化心得 图片优化

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 对于旅游类网站来说,图片是非常重要的一部分,图片不仅可以更形象的展示他们的产片,也可以给客户带来许多视觉上的享受,所以,图片在旅游网站中占的分量是非常之大.但是对于优化工作来说,图片又是非常难跨过的一道坎,以为自从搜索引擎诞生到现在,搜索引擎的程序员门都是只能攻克收录程序收录文本,虽然现在有些程序是可以收录图片之类的东西,毕竟那是非常非常少一

Android 高仿QQ图片选择器_Android

当做一款APP,需要选择本地图片时,首先考虑的无疑是系统相册,但是Android手机五花八门,再者手机像素的提升,大图无法返回等异常因数,导致适配机型比较困难,微信.QQ都相继的在自己的APP里集成了图片选择功能,放弃了系统提供的图片选择器,这里仿造QQ做了一个本地图片选择器,PS:之前有人说"仿"写成"防"了,今儿特意注意了下,求不错. 先上一张效果图,无图无真相啊~~~ 实现的效果大概是这样的: 1.单选:跳转到本地图片选择文件夹,选择文件夹后,进入到该文件夹下

android内存优化之图片优化

对图片本身进行操作.尽量不要使用setImageBitmap.setImageResource.BitmapFactory.decodeResource来设置一张大图,因为这些方法在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存.因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的source,decodeStream最大的秘密在于其直接调用JNI>>nativeDeco

Cocos2d-x优化中图片优化

在2D游戏中图片无疑是最为重要的资源文件它会被加载到内存中转换为纹理由GPU贴在精灵之上渲染出来.它能够优化的方面很多包括图片格式.拼图和纹理格式等下面我们从这几个方面介绍一下图片和纹理的优化.1.选择图片格式要回答这个问题我们需要先了解一下目前在移动平台所使用的图片文件格式以及这些图片格式Cocos2d-x是否支持.图片格式有很多但是在移动平台主要推荐使用的PNGJPG也可以考虑而其它的文件格式最好转化成为PNG格式.我们先了解一下它们的特点.1.PNG文件PNG文件格式设计目的是替代GIF和

Android实现平铺图片效果_Android

最近开发App,美工设计了一个有锯齿边沿效果的背景图,只给了我一个锯齿,然后需要平铺展示锯齿效果: android中实现平铺图片有两种方式: (1)在drawable中的drawable文件中定义平铺的Bitmap <?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" an

安卓(Android)ListView 显示图片文字_Android

一.代码实现 1.  "Activity_11\src\yan\activity_11\MainActivity.java" package yan.activity_11; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import a