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内存溢出问题
android bitmap outofMemory 用来解决android中常见的bitmap outOfMemory
Android中bitmap引起内存溢出的解决方案的对比分析.pdf
关于android内存机制的介绍,以及bitmap的内存泄露等问题的处理方式
可以很好的出来android开发过程中,由bitmap导致的内存溢出的问题。
android加载大图片的时候防止内存溢出的分析
在Android开发过程中,Bitmap往往会给开发者带来一些困扰,因为对Bitmap操作不慎,就容易造成OOM(Java.lang.OutofMemoryError – 内存溢出),本篇博客,我们将一起探讨Bitmap的性能优化。 为什么Bitmap会导致OOM? 1...
2. 由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出。Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直接导致内存OOM,只有在BitmapFactory加载图片时使用...
首先解析一下基本的知识:位图模式,bitmap颜色位数是1位灰度模式,bitmap颜色位数是8位,和256色一样 首先解析一下基本的知识: 位图模式,bitmap颜色位数是1位 灰度模式,bitmap颜色位数是8位,和256色一样 ...
//将图片设为原来宽高的1/2,防止内存溢出 Bitmap bm = BitmapFactory.decodeFile("",option);//文件流 URL url = new URL(""); InputStream is = url.openStream(); Bitmap bm = BitmapFactory.decodeStream(is); ...
本文实例总结了Android编程之内存溢出解决方案(OOM)。分享给大家供大家参考,具体如下: 在最近做的工程中发现加载的图片太多或图片过大时经常出现OOM问题,找网上资料也提供了很多方法,但自己感觉有点乱,特此,...
双缓存机制下,Android应用会对大内存的图片做二级缓存,对于溢出缓存的bitmap实行recycle,但是有些bitmap正在显示,会造成概率性的花屏等, 该方案提供了一套完整的防止recycle正在显示的bitmap的方案
在程序运行中会创建对象,如果未合理管理内存,比如不及时回收无效空间就会造成内存泄露,严重的话可能导致使用内存超过系统分配内存,即内存溢出OOM,导致程序卡顿甚至直接退出。 内存泄露(Memory Le
实现Android相机拍照、相册选取后直接显示以及截图后显示,解决因Bitmap导致的内存溢出问题。
在应用中,如果大量的使用bitmap就很可能导致内存溢出的问题。比如我在曾经的一个项目中遇到的问题:要使用Gallery来显示多张不同的图片,在给Gallery的每个Item设置图片的时候,想到Bitmap如果不手动的recycle,系统...
Android 图片自动加载管理类 解决内存溢出 控件重用图片错位 自动加载网络图片 文件缓存、自动释放文件缓存
Android拍照、相册选取、截图综合。 实现Android相机拍照、相册选取后直接显示以及截图后显示,解决因Bitmap导致的内存溢出问题。
摘要:Java源码,Android源码,Android截图 Android相机拍照、相册选取后直接显示以及截图后显示,解决因Bitmap导致的内存溢出问题,源码实现过程部分注释讲解: 将保存在本地的图片取出并缩小后显示在界面上、由于...
实现从相机拍照和相册选取图片显示并保存到本地SD卡操作Demo,避免了Bitmap导致的内存溢出