Android手机开发之图片内存优化几点

1、将图片转化为缩略图再加载:

 代码如下 
1 BitmapFactory.Options options = new BitmapFactory.Options();
2 options.inSampleSize = 2;
3 Bitmap img = BitmapFactory.decodeFile("/sdcard/1.png", options);

该段代码即是读取1.png的缩略图,长度、宽度都只有原图片的1/2。图片大小减少,占用的内存自然也变小了。这么做的弊端是图片质量变差,inSampleSize的值越大,图片的质量就越差。由于各手机厂商缩放图片的算法不同,在不同手机上的缩放图片质量可能会不同。笔者就遭遇过moto手机上图片缩放后质量可以接受,三星手机上同样的缩放比例,质量却差很多的情况。

2、用ARBG_4444颜色模式加载图片:

Android中有四种,分别是:

ALPHA_8:每个像素占用1byte内存

ARGB_4444:每个像素占用2byte内存

ARGB_8888:每个像素占用4byte内存

RGB_565:每个像素占用2byte内存

Android默认的颜色模式为ARGB_8888,这个颜色模式色彩最细腻,显示质量最高。但同样的,占用的内存也最大。

 代码如下 
1 BitmapFactory.Options options = new BitmapFactory.Options();
2 options.inPreferredConfig = Bitmap.Config.ARGB_4444;   
3 Bitmap img = BitmapFactory.decodeFile("/sdcard/1.png", options);

以上代码即是将1.png以ARGB_4444模式读出。内存减少虽然不如第一种方法明显,但是对于大多数图片,看不出与ARGB_8888模式有什么差别。不过在读取有渐变效果的图片时,可能有颜色条出现。另外,会影响图片的特效处理。

3、调用图片的recycle()方法:

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

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,所以实际内存还是减少了。

 

时间: 2024-09-28 04:24:19

Android手机开发之图片内存优化几点的相关文章

高手请带带我android手机开发

问题描述 我想请为高手带带我进行android手机开发,实在有太多的不懂.

android开发中的内存优化

一.Android应用程序内存优化 在开发Android App的过程中,经常会遇到内存方面的压力,比如OOM,或者频繁GC.本文不打算涵盖内存优化的所有方面,只是介绍一下我自己遇到的问题和解决方法. 1.确定频繁分配内存的代码路径 一般来说,频繁分配内存的路径可能会是绘制(draw)相关的方法,排版(layout)相关的方法,某些回调方法(特别是传感器回调方法).你可能会检查这部分代码,然后优化它.但是,内存分配可能发生在调用链的更下面,检查代码非常困难.这里推荐一个工具,DDMS下的Allo

Android图片内存优化的几点心得

1.将图片转化为缩略图再加载: BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2; Bitmap img = BitmapFactory.decodeFile("/sdcard/1.png", options); 该段代码即是读取1.png的缩略图,长度.宽度都只有原图片的1/2.图片大小减少,占用的内存自然也变小了.这么做的弊端是图片质量变差,inSampleSi

【ANDROID游戏开发之十】(优化处理)详细剖析ANDROID TRACEVIEW效率检视工具,分析程序运行速度!并讲解两种创建SDCARD方式!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/316.html ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读:

抄袭iphone的Android手机原始概念图片

还记得苹果和谷歌两家公司之间的恩怨情仇么?苹果在 2007年发布了第一代iPhone,那时谷歌还没有进入智能手机行业.随后,谷歌发布了Android操作系统,两家公司之间的和平状态也彻底被打破了.苹果称谷歌Android系统抄袭了iPhone的设计,而谷歌则表示Android系统并没有抄袭iPhone.但今天出现了2006年谷歌原始概念手机的设计图,那时谷歌并没有将手机上的键盘去掉,那时的Android手机更像是一款黑莓手机.在2007年iPhone发布之后,谷歌的手机设计就转变成图中右侧那样与

安卓(android)手机开发之环境搭建 HelloWord

因为之前做了个安卓壁纸站所以我们突然想起了安卓手机开发了,下面来看我的安卓环境配置文章吧. 这次接触安卓环境,一切都很陌生:花了一个下午的时间,走了很多弯路,不过最终还是把环境搭成了.下面总结一下搭建步骤: 第一步:安装Java SDK 本文环境所用的Jdk"jdk-6u25-windows-i586.exe",下载地址读者可以自行到Oracle官方网站上下载最新的安装程序.(参考地址:http://www.oracle.com/technetwork/java/javase/down

Android手机开发环境配置图解

近日开始学习Android的开发,所以开始使用Android.        既然要使用,那么就少不了要搭建一个语言的开发环境.下面就开始讲解吧,其实很简单,但是可能有点小问题,所以还是做下记录的好.         No.1:下载JDK.        地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html        JDK是java语言开发的基础.我们这里下载最新版本的.

android手机开发之实现图片循环播放

很多时候,我们需要展示在客户端展示图片,而且是动态显示,即不停地自行切换图片.下面我们来看一下具体的实现方法. 首先,我们需要在XML文件中配置一下将要播放图片的控件(main.xml):  代码如下 复制代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android手机开发自定义标题栏

一.概述 每一个应用程序默认的标题栏(注意与状态栏的区别)只有一行文字(新建工程时的名字),而且颜色.大小等都是固定的,给人的感觉比较单调.但当程序需要美化的时候,那么修改标题栏是就是其中一项内容,虽然Android已经定义了很多样式资源,但更多时候我们需要使用的是自己定义的样式. 二.要求 使用自己定义的样式来修改程序的标题栏. 三.实现 新建工程MyTitle,不用修改main.xml文件,在/res/layout目录下新建布局文件title.xml,在里面添加一个TextView和一个Bu