全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java.lang.OutOfMemoryError: bitmap size exceeds VM budget解决方法用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。BitmapFactory.Options.inSampleSize设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误。inSampleSize的具体含义请参考SDK文档。例如:?123BitmapFactory.Options opts = newBitmapFactory.Options();opts.inSampleSize = 4;Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);如何设置恰当的inSampleSize设置恰当的inSampleSize是解决该问题的关键之一。BitmapFactory.Options提供了另一个成员inJustDecodeBounds。?123BitmapFactory.Options opts = newBitmapFactory.Options();opts.inJustDecodeBounds = true;Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);设置inJustDecodeBounds为true后,decodeFile并不分配空间,但可计算出原始图片的长度和宽度,即opts.width和opts.height。有了这两个参数,再通过一定的算法,即可得到一个恰当的inSampleSize。查看Android源码,Android提供了一种动态计算的方法。?12345678910111213141516171819202122232425262728293031323334353637383940414243publicstaticintcomputeSampleSize(BitmapFactory.Options options,intminSideLength, intmaxNumOfPixels) intinitialSize = computeInitialSampleSize(options, minSideLength,maxNumOfPixels);introundedSize;if(initialSize = 8) roundedSize = 1;while(roundedSize initialSize) roundedSize = 1; elseroundedSize = (initialSize + 7) / 8* 8;returnroundedSize;privatestaticintcomputeInitialSampleSize(BitmapFactory.Options options,intminSideLength, intmaxNumOfPixels) doublew = options.outWidth;doubleh = options.outHeight;intlowerBound = (maxNumOfPixels = -1) ? 1:(int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels);intupperBound = (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.returnlowerBound;if(maxNumOfPixels = -1) &(minSideLength = -1) return1; elseif(minSideLength = -1) returnlowerBound; elsereturnupperBound; 使用该算法,就可动态计算出图片的inSampleSize。?1234567891011BitmapFactory.Options opts = newBitmapFactory.Options();opts.inJustDecodeBounds = true;BitmapFactory.decodeFile(imageFile, opts);opts.inSampleSize = computeSampleSize(opts, -1, 128*128); opts.inJustDecodeBounds = false;tryBitmap bmp = BitmapFactory.decodeFile(imageFile, opts);imageView.setImageBitmap(bmp); catch(OutOfMemoryError err) 另外,可以通过Bitmap.recycle()方法来释放位图所占的空间,当然前提是位图没有被使用。获取缩略图关键代码byte imageByte=getImageFromURL(urlPathi.trim();/以下是把图片转化为缩略图再加载BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true; /首先设置.inJustDecodeBounds为trueBitmap bitmap=BitmapFactory.decodeByteArray(imageByte, 0, imageByte.length, options); /这时获取到的bitmap是null的,尚未调用系统内存资源options.inJustDecodeBounds = false; 得到图片有宽和高的options对象后,设置.inJustDecodeBounds为 be = (int)(options.outHeight / (float)200); if (be = 0) be = 1; options.inSampleSize = be; /计算得到图片缩小倍数bitmapsi=BitmapFactory.decodeByteArray(imageByte, 0, imageByte.length,options); /获取真正的图片对象(缩略图)/* *根据图片网络地址获取图片的byte类型数据*paramurlPath图片网络地址*return图片数据 */ 1. publicbytegetImageFromURL(StringurlPath)2. bytedata=null;3. InputStreamis=null;4. HttpURLConnectionconn=null;5. try6. URLurl=newURL(urlPath);7. conn=(HttpURLConnection)url.openConnection();8. conn.setDoInput(true);9. /conn.setDoOutput(true);10. conn.setRequestMethod(GET);11. conn.setConnectTimeout(6000);12. is=conn.getInputStream();13. if(conn.getResponseCode()=200)14. data=readInputStream(is);15. 16. elseSystem.out.println(发生异常!);17. 18. catch(MalformedURLExceptione)19. e.printStackTrace();20. catch(IOExceptione)21. e.printStackTrace();22. 23. finally24. conn.disconnect();25. try26. is.close();27. catch(IOExceptione)28. e.printStackTrace();29. 30. 31. returndata;32. 33. 34. /*35. *读取InputStream数据,转为byte数据类型36. *paramisInputStream数据37. *return返回byte数据38. */39. publicbytereadInputStream(InputStreamis)40. ByteArrayOutputStreambaos=newByteArrayOutputStream();41. bytebuffer=newbyte1024;42. intlength=-1;43. try44. while(length=is.read(buffer)!=-1)45. baos.write(buffer,0,length);46. 47. baos.flush();48. catch(IOExceptione)49. e.printStackTrace();50. 51. bytedata=baos.toByteArray();52. try53. is.close();54. baos.close();55. catch(IOExceptione)56. e.printStackTrace();57. 58. returndata;59. 60. 61. /*62. *根据网络图片地址集批量获取网络图片63. *paramurlPath网络图片地址数组64. *return返回Bitmap数据类型的数组65. */66. publicBitmapgetBitmapArray(StringurlPath)67. intlength=urlPath.length;68. if(urlPath=null|length1)69. returnnull;70. 71. else72. Bitmapbitmaps=newBitmaplength;73. for(inti=0;ilength;i+)74. byteimageByte=getImageFromURL(urlPathi.trim();75. 76. /以下是把图片转化为缩略图再加载77. BitmapFactory.Optionsoptions=newBitmapFactory.Options();78. options.inJustDecodeBounds=true;79. Bitmapbitmap=BitmapFactory.decodeByteArray(imageByte,0,imageByte.length,options);8
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CSES 160-2024二氧化碳地质利用与封存项目监测范围确定技术指南
- 产科虚拟分娩模拟与产科质量提升
- 初中数学九年级上册期末复习易错单选题专项练习附答案及解析2
- 2025年江苏省南通市中考生物真题卷(含答案与解析)
- 亚洲儿童糖尿病代谢特点与管理差异
- 冷库火灾发生原因及预防措施分析
- 略论孔子的战争观
- 2025年中国蛋鸡产业发展研究报告
- 临床试验药物供应的应急响应流程
- “信息检索与利用”检索报告(数据库检索)
- 医用高压氧舱项目可行性实施报告
- MOOC 医事法学-西南医科大学 中国大学慕课答案
- 重庆大学材料科学与工程学院《833土木工程材料》历年考研真题汇编
- 2024年上海春考语文试题及参考答案作文范文(搜集整理版)
- 《农业保险承保理赔电子化作业规范》
- 中国科学院大学2023年619物理化学(甲)考研真题(含答案)
- 合规与供应商合作管理方案
- 社会责任与商业道德管理办法培训记录表
- 外科学 脾切除术(手术图谱)
- 泌外科护理业务学习、“三基”培训记录模板
- GB/T 20670-2006统一螺纹直径与牙数系列
评论
0/150
提交评论