android处理图片内存溢出VM_第1页
android处理图片内存溢出VM_第2页
android处理图片内存溢出VM_第3页
android处理图片内存溢出VM_第4页
android处理图片内存溢出VM_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、使用an droid提供的BitmapFactory 解码一张图片时,有时会遇到该错误,即:javaan g.OutOfMemoryError: bitmap size exceeds VM budget。这往往是由于图片过大造成的。要想正常使用,一种方式是分配更少的内存空间来存储,即在载入图片的时候以牺牲图片质量为代价,将图片进行放缩,这也是不少人现在为避免以上的OOM所采用的解决方法。但是,这种方法是得不偿失的,当我们使用图片作为缩略图查看时候 倒是没有说什么,但是,当需要提供图片质量的时候,该怎么办呢?java.la ng.OutOfMemoryError: bitmap size ex

2、ceeds VM budget着实让不少人欲哭无泪呀!前几天刚好有个需求需要载入SD卡上面的图片。首先是使用Bitmap bmp =BitmapFactory.decodeFile(pePicFile.getAbsolutePath() +"/"+i nfo.getlmage();上面参数是我将要读取的图片文件及路径,当文件较小时,程序能够正常运行,但是当我选择一张大图时,程序立刻蹦出了java.la ng.OutOfMemoryError: bitmap sizeexceeds VM budget 的 OOM 错误!在 an droid 设备上(where you hav

3、e only 16MB memory available ),如果使用BitmapFactory 解码一个较大文件,很大的情况下会出现上述情况。那么,怎么解决?!先说之前提到过的一种方法:即将载入的图片缩小,这种方式以牺牲图片的质量为代价。在 BitmapFactory 中有一个内部类 BitmapFactory.Options ,其中当optio ns.i nSampleSize值 >1 时,根据文档:If set to a value > 1, requests the decoder to subsample the origi nalimage, returninga sm

4、aller image to save memory. (1 -> decodes full size;2 -> decodes 1/4th size; 4 -> decode 1/16th size). Because you rarelyn eed to show and have full size bitmap images on your phone. Formani pulati ons smaller sizes are usually eno ugh.也就是说,options.inSampleSize是以2的指数的倒数被进行放缩。这样,我们可以依靠inSamp

5、leSize的值的设定将图片放缩载入,这样一般情况也就不会出现上述的OOM'可题了。现在问题是怎么确定inSampleSize 的值?每张图片的放缩大小的比例应 该是不一样的!这样的话就要运行时动态确定。在BitmapFactory.Optio ns中提供了另一个成员 inJustDecodeBounds 。BitmapFactory.Options opts = newBitmapFactory.Options();opts.i nJ ustDecodeBo unds = true;Bitmap bitmap = BitmapFactory.decodeFile(imageFile,

6、 opts);设置inJustDecodeBounds 为true后,decodeFile并不分配空间,但可计算出原始图片的长度和宽度,即 opts.width和opts.height。有了这两个参数,再通过一定的算法, 即可得到一个恰当的in SampleSize。An droid提供了一种动态计算的方法。如下:public static int computeSampleSize(BitmapFactory.Opti onsopti ons, in t min SideLe ngth, i nt maxNumOfPixels) int in itialSize = compute In i

7、tialSampleSize(optio ns,minSideLength, maxNumOfPixels);int roun dedSize;if (initialSize <= 8) roun dedSize = 1;while(ro un dedSize<i nitialSize)roundedSize <<= 1; / 这是什么意思,这里应该写+=1吧! else rou ndedSize = (in itialSize + 7) / 8 * 8; /这里让它保持是8的整数倍,有什么意思在里面嘛?貌似8这个,像是内存分配的什么栈大小样retur n roun d

8、edSize;private static intcompute In itialSampleSize(BitmapFactory.Opti ons opti ons, intminSideLength, int maxNumOfPixels) double w = opti on s.outWidth;double h = opti on s.outHeight;int lowerBound = (maxNumOfPixels = -1) ? 1 : (int)Math.ceil(Math.sqrt(w * h / maxNumOfPixels);int upperBou nd = (mi

9、nSideLe ngth = -1) ? 128 :(int) Math.mi n(Math.floor(w / mi nSideLe ngth), Math.floor(h /min SideLe ngth);if (upperBo und < lowerBo und) return lowerBo und;if (maxNumOfPixels = -1) && (mi nSideLe ngth =-1) return 1; else if (min SideLe ngth = -1) return lowerBo und; else retur n upperB ou

10、nd; 以上参考一下,我们只需要使用此函数就行了:BitmapFactory.Options opts = newBitmapFactory.Optio ns();opts.i nJ ustDecodeBo unds = true;BitmapFactory.decodeFile(imageFile, opts);opts.i nSampleSize = computeSampleSize(opts, -1,128*128); /这里一定要将其设置回false,因为之前我们将其设置成了 true/上面函数的参数意思不太懂opts.i nJ ustDecodeBo unds = false;tr

11、y Bitmap bmp二 BitmapFactory.decodeFile(imageFile,opts);imageView.setlmageBitmap(bmp); catch (OutOfMemoryError err) 这样,在 BitmapFactory.decodeFile执行处,也就不会报出上面的 OOM Error 了。完美解决?如前面提到的,这种方式在一定程度上是以牺牲图片质量为代价的。如何才能更加优化的实现需求?当在an droid设备中载入较大图片资源时,可以创建一些临时空间,将载入的资源载入到临时空间中。BitmapFactory.OptionsbfOptions二n

12、ew BitmapFactory.Options();bfOptions.inTempStorage二new byte12 * 1024;以上创建了一个 12kb的临时空间。然后使用 Bitmap bitmapImage = BitmapFactory.decodeFile(path,bfOptio ns);但是我在程序中却还是出现以上问题!以下使用BitmapFactory.decodeFileDescriptor解决了以上问题:/为何要这样而不是黄色的那样才能解决?BitmapFactory.OptionsbfOptions=new BitmapFactory.Options();bfOp

13、tio ns.i nDither=false;/使图片不抖动。不是很懂bfOptio ns.i nPurgeable=true; / 使得内存可以被回收bfOptio ns.i nTempStorage=new byte12 * 1024; / 临时存储/ bfOpti on s.i nJ ustDecodeBo unds = true;File file = new File(pePicFile.getAbsolutePath() +"/"+i nfo.getImage();FilelnputStream fs=null;try fs = new FilelnputStream(file); catch (FileNotFo un dExcepti on e) e.pri ntStackTrace();Bitmap bmp = n ull;if(fs != null)try bmp = BitmapFactory.decodeFileDescriptor(fs.getFD(),null, bfOptions);/这样莫非就让bm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论