`

android bitmap内存溢出

 
阅读更多
BitmapFactory.decodeFile(imageFile);

 

用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。

BitmapFactory.Options.inSampleSize

设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误。inSampleSize的具体含义请参考SDK文档。例如:

BitmapFactory.Options opts = new BitmapFactory.Options();
	opts.inSampleSize = 4;
	Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);

 

如何设置恰当的inSampleSize

设置恰当的inSampleSize是解决该问题的关键之一。BitmapFactory.Options提供了另一个成员inJustDecodeBounds。

BitmapFactory.Options opts = new BitmapFactory.Options();
	opts.inJustDecodeBounds = true;
	Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);

 

设置inJustDecodeBounds为true后,decodeFile并不分配空间,但可计算出原始图片的长度和宽度,即opts.width和opts.height。有了这两个参数,再通过一定的算法,即可得到一个恰当的inSampleSize。

查看Android源码,Android提供了一种动态计算的方法。

public static int computeSampleSize(BitmapFactory.Options options,
	        int minSideLength, int maxNumOfPixels) {
	    int initialSize = computeInitialSampleSize(options, minSideLength,
	            maxNumOfPixels);
	 
	    int roundedSize;
	    if (initialSize <= 8) {
	        roundedSize = 1;
	        while (roundedSize < initialSize) {
	            roundedSize <<= 1;
	        }
	    } else {
	        roundedSize = (initialSize + 7) / 8 * 8;
	    }
	 
	    return roundedSize;
	}
	 
	private static int computeInitialSampleSize(BitmapFactory.Options options,
            int minSideLength, int maxNumOfPixels) {
	    double w = options.outWidth;
	    double h = options.outHeight;
	 
	    int lowerBound = (maxNumOfPixels == -1) ? 1 :
	            (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
	    int upperBound = (minSideLength == -1) ? 128 :
	            (int) Math.min(Math.floor(w / minSideLength),
	            Math.floor(h / minSideLength));
	 
	    if (upperBound < lowerBound) {
	        // return the larger one when there is no overlapping zone.
	        return lowerBound;
	    }
	 
	    if ((maxNumOfPixels == -1) &&
	            (minSideLength == -1)) {
	        return 1;
	    } else if (minSideLength == -1) {
	        return lowerBound;
	    } else {
	        return upperBound;
	    }
	}   

 使用该算法,就可动态计算出图片的inSampleSize。

BitmapFactory.Options opts = new BitmapFactory.Options();
	opts.inJustDecodeBounds = true;
	BitmapFactory.decodeFile(imageFile, opts);
	             
	opts.inSampleSize = computeSampleSize(opts, -1, 128*128);      
	opts.inJustDecodeBounds = false;
	try {
	    Bitmap bmp = BitmapFactory.decodeFile(imageFile, opts);
	    imageView.setImageBitmap(bmp);
	    } catch (OutOfMemoryError err) {
	    }

 另外,可以通过Bitmap.recycle()方法来释放位图所占的空间,当然前提是位图没有被使用。

 

 

转载 http://www.cnblogs.com/RayLee/archive/2010/11/09/1872856.html

分享到:
评论

相关推荐

    处理bitmap内存溢出问题

    处理bitmap内存溢出问题

    android bitmap outOfMemory解决方法

    android bitmap outofMemory 用来解决android中常见的bitmap outOfMemory

    Android中bitmap引起内存溢出的解决方案的对比分析.pdf

    Android中bitmap引起内存溢出的解决方案的对比分析.pdf

    Android的内存机制和溢出说明

    关于android内存机制的介绍,以及bitmap的内存泄露等问题的处理方式

    bitmap内存问题

    可以很好的出来android开发过程中,由bitmap导致的内存溢出的问题。

    加载大图片的时候如何防止内存溢出

    android加载大图片的时候防止内存溢出的分析

    Android性能优化之Bitmap图片优化详解

    在Android开发过程中,Bitmap往往会给开发者带来一些困扰,因为对Bitmap操作不慎,就容易造成OOM(Java.lang.OutofMemoryError – 内存溢出),本篇博客,我们将一起探讨Bitmap的性能优化。 为什么Bitmap会导致OOM? 1...

    Android加载图片内存溢出问题解决方法

    2. 由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出。Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直接导致内存OOM,只有在BitmapFactory加载图片时使用...

    Android加载大图片内存溢出

    首先解析一下基本的知识:位图模式,bitmap颜色位数是1位灰度模式,bitmap颜色位数是8位,和256色一样  首先解析一下基本的知识:  位图模式,bitmap颜色位数是1位  灰度模式,bitmap颜色位数是8位,和256色一样 ...

    android Bitmap用法总结

    //将图片设为原来宽高的1/2,防止内存溢出 Bitmap bm = BitmapFactory.decodeFile("",option);//文件流 URL url = new URL(""); InputStream is = url.openStream(); Bitmap bm = BitmapFactory.decodeStream(is); ...

    Android编程之内存溢出解决方案(OOM)实例总结

    本文实例总结了Android编程之内存溢出解决方案(OOM)。分享给大家供大家参考,具体如下: 在最近做的工程中发现加载的图片太多或图片过大时经常出现OOM问题,找网上资料也提供了很多方法,但自己感觉有点乱,特此,...

    Android 双缓存机制下 Bitmap Recycle方案

    双缓存机制下,Android应用会对大内存的图片做二级缓存,对于溢出缓存的bitmap实行recycle,但是有些bitmap正在显示,会造成概率性的花屏等, 该方案提供了一套完整的防止recycle正在显示的bitmap的方案

    浅谈Android应用的内存优化及Handler的内存泄漏问题

    在程序运行中会创建对象,如果未合理管理内存,比如不及时回收无效空间就会造成内存泄露,严重的话可能导致使用内存超过系统分配内存,即内存溢出OOM,导致程序卡顿甚至直接退出。 内存泄露(Memory Le

    Android拍照、相册选取、截图综合Demo

    实现Android相机拍照、相册选取后直接显示以及截图后显示,解决因Bitmap导致的内存溢出问题。

    大图片所引起的内存问题

    在应用中,如果大量的使用bitmap就很可能导致内存溢出的问题。比如我在曾经的一个项目中遇到的问题:要使用Gallery来显示多张不同的图片,在给Gallery的每个Item设置图片的时候,想到Bitmap如果不手动的recycle,系统...

    BitmapManage

    Android 图片自动加载管理类 解决内存溢出 控件重用图片错位 自动加载网络图片 文件缓存、自动释放文件缓存

    Android拍照、相册选取、截图综合

    Android拍照、相册选取、截图综合。 实现Android相机拍照、相册选取后直接显示以及截图后显示,解决因Bitmap导致的内存溢出问题。

    Android相机拍照、截图功能的实例演示

    摘要:Java源码,Android源码,Android截图 Android相机拍照、相册选取后直接显示以及截图后显示,解决因Bitmap导致的内存溢出问题,源码实现过程部分注释讲解:  将保存在本地的图片取出并缩小后显示在界面上、由于...

    Android相机、相册获取图片显示并保存

    实现从相机拍照和相册选取图片显示并保存到本地SD卡操作Demo,避免了Bitmap导致的内存溢出

Global site tag (gtag.js) - Google Analytics