解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
来源:互联网 发布:js获取当前设备 编辑:程序博客网 时间:2024/05/21 18:49
原文出处:http://www.maxhis.info/archives/491
当图片过大,或图片数量较多时使用BitmapFactory解码图片会出java.lang.OutOfMemoryError: bitmap size exceeds VM budget,要想正常使用则需分配更少的内存,具体的解决办法是修改采样值BitmapFactory.Options.inSampleSize,例如:
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()方法来释放位图所占的空间,当然前提是位图没有被使用。
- java.lang.OutOfMemoryError:bitmap size exceeds VM budget 如何解决
- 完美解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- 完美解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- 解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- Android解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- Android解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- 完美解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- 完美解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- 完美解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- 完美解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- Android解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- 完美解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- 完美解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- 完美解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- java.lang.OutOfMemoryError: bitmap size exceeds VM budget解决方法
- java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- 【iphone游戏开发】iphone-Cocos2D游戏开发之二:精灵表的详细讲解(一)和Zwoptex工具的使用
- 在接口中不要存在实现代码
- DirectX 3D编程入门教程三 网格及其X文件格式
- c errorno
- tcp
- 解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- 看win7怎么给u盘加密
- html5中往矩形中贴图片
- Ubuntu桌面系统汇总
- 无法显示隐藏的文件或文件夹
- Java内部类模拟实现多继承
- Mac平台retina高分屏开发技术分享
- 【iphone游戏开发】iphone-Cocos2d游戏开发之三:精灵表的详细讲解(二)小鸟眨眼睛
- Linux 下socket超时(connect超时/recv超时)