`
jiguansheng
  • 浏览: 127707 次
  • 性别: Icon_minigender_1
  • 来自: 九江
社区版块
存档分类
最新评论

错误:bitmap size exceeds VM budget

 
阅读更多

 

private Bitmap decodeFile(File f){
    Bitmap b = null;
    try {
        //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f), null, o);
        int scale = 1;
        if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) {
            scale = Math.pow(2, (int) Math.round(Math.log(IMAGE_MAX_SIZE / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5)));
        }

        //Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        b = BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (FileNotFoundException e) {
    }
    return b;
}
 

 

转自http://www.cnblogs.com/RayLee/archive/2010/11/09/1872856.html

 

BitmapFactory.decodeFile(imageFile);

用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。

BitmapFactory.Options.inSampleSize

设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误。inSampleSize的具体含义请参考SDK文档。例如:

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);

 

 

设置恰当的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()方法来释放位图所占的空间,当然前提是位图没有被使用。

 

分享到:
评论

相关推荐

    android_内存溢出处理

    在 Android 中,用 bitmap 时很容易内存溢出,报如下错误:Java.lang.OutOfMemoryError:bitmap size exceeds VM budget。解决这个问题可以通过手动干涉 GC 去处理 bitmap 设置图片尺寸,避免内存溢出。 例如: ```...

    Android’s 24 MB memory limit

    一旦超出限制,应用就会收到“OutOfMemoryError: bitmap size exceeds VM budget”异常,并被操作系统强制关闭。例如: ``` E/dalvikvm-heap(12517): 1048576-byte external allocation too large for this process...

    处理bitmap内存溢出问题

    当应用程序尝试加载或操作一张超出虚拟机内存预算的`Bitmap`时,系统会抛出`java.lang.OutOfMemoryError: bitmap size exceeds VM budget`异常,导致应用崩溃。为了解决这个问题,开发者需要采取一些策略来优化图片...

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY[文].pdf

    当Android系统尝试分配一块超过其当前可用内存大小的内存时,会抛出`java.lang.OutOfMemoryError: bitmap size exceeds VM budget`异常。从日志可以看出,问题出现在尝试解码一个资源(可能是图片)到Bitmap对象时,...

    android 处理图片内存溢出 VM.pdf

    当尝试加载大尺寸的图片时,可能会遇到`java.lang.OutOfMemoryError: bitmap size exceeds VM budget`错误,这是因为Android虚拟机(VM)的内存预算有限,尤其是对于较大的图片,如果直接加载原图,会消耗大量内存,...

    C# 图片裁剪器(使用:Bitmap)

    Size thumbnailSize = new Size((int)(croppedImage.Width / scaleFactor), (int)(croppedImage.Height / scaleFactor)); Bitmap thumbnail = new Bitmap(thumbnailSize.Width, thumbnailSize.Height); using ...

    RoaringBitmap-0.7.45-API文档-中英对照版.zip

    Maven坐标:org.roaringbitmap:RoaringBitmap:0.7.45; 标签:roaringbitmap、RoaringBitmap、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 ...

    android处理图片内存溢出VM.pdf

    当应用尝试加载超出虚拟机内存预算的大图片时,会抛出一个常见的异常java.lang.OutOfMemoryError: bitmap size exceeds VM budget。图片加载时的内存溢出主要因为大尺寸图片占用的内存远远超过了分配给应用的内存...

    java算法:BitMap

    位图算法

    RoaringBitmap-0.5.11-API文档-中文版.zip

    Maven坐标:org.roaringbitmap:RoaringBitmap:0.5.11; 标签:roaringbitmap、RoaringBitmap、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化...

    RoaringBitmap-0.7.45-API文档-中文版.zip

    Maven坐标:org.roaringbitmap:RoaringBitmap:0.7.45; 标签:roaringbitmap、RoaringBitmap、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化...

    RoaringBitmap-0.5.11-API文档-中英对照版.zip

    Maven坐标:org.roaringbitmap:RoaringBitmap:0.5.11; 标签:roaringbitmap、RoaringBitmap、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档...

    bitmap理解学习例子

    Bitmap是Android系统中用于处理图像的核心类,它在Android应用开发中扮演着至关重要的角色。Bitmap对象代表了图像数据,可以是位图(如PNG、JPEG或BMP格式)或者是可绘制对象(如通过Canvas绘制的图形)。在这个...

    Android安卓BitmMap工具类

    1.saveBitmap: 把Bitmap对象持久存储到SD卡或手机内存. 2.getViewBitmap: 从view得到bitmap对象 3.addWatermark: Bitmap加水印 4.zoomBitmap: 放大缩小图片 5.getLoacalBitmap: 传入路径,从持久存储(SD卡或手机内存)...

    Bitmap位图资源

    Bitmap位图资源是计算机图形学中的一个重要概念,尤其在游戏开发和移动应用设计中不可或缺。Bitmap,也称为位映射或栅格图像,是由像素数组构成的,每个像素都有自己的颜色值,这些颜色值组合起来就形成了我们看到的...

    Android图片Bitmap和字符串String之间的相互转换

    2. String转Bitmap: - Base64解码:接收到Base64编码的字符串后,解码回ByteArray,然后使用BitmapFactory创建Bitmap对象。 - PNG/JPEG解码:如果字符串是PNG或JPEG格式,可以使用BitmapFactory的decodeByteArray...

    3个bitmap文件

    Bitmap(BMP)文件是一种常见的图像文件格式,广泛应用于Windows操作系统和许多图形处理软件中。在本主题中,我们有三个具体的Bitmap文件:第2图.bmp、第3图.bmp和第1图.dib。虽然“.dib”扩展名不太常见,但它实际...

    解析activity之间数据传递方法的详解

    频繁使用静态的Bitmap或Drawable可能导致`java.lang.OutOfMemoryError: bitmap size exceeds VM budget`异常,因此应谨慎使用。 第三种方法是基于外部存储的数据传输,包括File、SharedPreferences、SQLite和...

    vc GDI+实现屏幕截图,图片裁剪,

    - 图片裁剪通常涉及到Bitmap类的Clone方法,它可以根据指定的矩形区域创建一个新的Bitmap对象。 - 首先,定义裁剪区域的坐标,如左上角的X和Y坐标,以及宽度和高度。 - 使用Clone方法,传入裁剪区域的参数,创建...

    MFC显示gif动画图片

    GIF的帧可以通过`Gdiplus::Bitmap::GetFrameDimensionsCount`和`Gdiplus::Bitmap::GetFrameDimensionsList`来获取,而帧延迟则通过`Gdiplus::Bitmap::GetPropertyItem`获取。 6. **绘制GIF帧**:在MFC的`OnPaint`...

Global site tag (gtag.js) - Google Analytics