当图片过大,或图片数量较多时使用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 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: Java heap space 解决方法
java.lang.OutOfMemoryError: PermGen space 解决方案
搜集整理关于java错误处理:java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: Java heap space 资料整理
Caused by: java.lang.OutOfMemoryError: PermGen space解决方案, avax.servlet.ServletException: java.lang.OutOfMemoryError: PermGen space at org.apache.jasper.servlet.JspServlet.service(JspServlet.java...
报错 java.lang.OutOfMemoryError: PermGen space 报错 java.lang.OutOfMemoryError: Java heap 启动报错java.lang.ClassNotFoundException: 1catalina.org.apache.juli.FileHandler JAVA_OPTS="-server -Xms800m ...
java.lang.OutOfMemoryError: PermGen space及其解决方法,解决项目太大tomcat内存溢出
NULL 博文链接:https://geyubin.iteye.com/blog/779330
java解决nested exception is java.lang.OutOfMemoryError Java heap space 解决OOM
记录java.lang.OutOfMemoryError:Java heap space的情况 文章内容: 一.问题描述+原因分析+解决方案 二.JVM调优说明 三.Tomcat添加到jvisualvm监控
Tomcat给我的java.lang.OutOfMemoryError: PermGenTomcat给我的java.lang.OutOfMemoryError: PermGenTomcat给我的java.lang.OutOfMemoryError: PermGenTomcat给我的java.lang.OutOfMemoryError: PermGenTomcat给我的...
Myeclipse下java.lang.OutOfMemoryError Java heap space的解决
Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError),内附解决方案!
java.lang.OutOfMemoryError处理错误
java.lang.OutOfMemoryError: Java heap space 解决方法
java.lang.OutOfMemoryError: PermGen space
tomcat内存溢出解决办法,错误信息:java.lang.OutOfMemoryError:PermGen space 参考该文档可快速解决内存溢出的问题,服务器:tomcat
编译时出现java.lang.OutOfMemoryError Java heap space异常.
内存不足OOM java.lang.OutOfMemoryError.
java[1].lang.OutOfMemoryError_Java_heap_space错误及处理办法java[1].lang.OutOfMemoryError_Java_heap_space错误及处理办法java[1].lang.OutOfMemoryError_Java_heap_space错误及处理办法