版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 盘山县高级中学面向辽宁师范大学2026年应届毕业生开展校园招聘教师考试参考试题及答案解析
- 2026年中国旅游集团有限公司校园招聘笔试备考试题及答案解析
- 2026年中国石油吉林石化分公司校园招聘考试备考题库及答案解析
- 2026年中国建筑集团有限公司校园招聘考试备考试题及答案解析
- 2026年民生实业集团有限公司校园招聘考试备考题库及答案解析
- 2026年食品安全知识培训考核题集
- 2026年河北省资产管理有限公司校园招聘考试备考题库及答案解析
- 2026年软件测试工程师认证考试题目
- 2026年安徽联通校园招聘考试备考题库及答案解析
- 2026年厦门路桥建设集团有限公司校园招聘笔试备考题库及答案解析
- 2026春花城版音乐三年级下册《飞飞曲》课件
- 2026年4月自考04184线性代数经管类押题及答案
- 2026中国农业科学院饲料研究所新兽药与免疫调控创新团队科研助理招聘2人备考题库及完整答案详解(各地真题)
- 【新教材】沪教版(2024)八年级下册英语Unit 2 Body language-Section 2 (Grammar)教案
- 2026年高考语文全真模拟试卷(含答案解析)
- 基于驾驶员风格的智能换挡策略研究-本科毕业论文
- 2025年四川省妇幼保健院儿科医师招聘3人笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 2025年农商行考试题及答案
- 2025中证信息技术服务有限责任公司招聘16人笔试备考试题附答案
- 8.3 新疆的地理概况与开发保护 课件 2025-2026学年湘教版地理八年级下册
- 高速路养护施工安全培训课件
评论
0/150
提交评论