避免Android中的Bitmap.createScaledBitmap出现OutOfMemoryError

时间:2014-06-19 03:36:03

标签: android bitmap out-of-memory

我正在使用以下代码来放大图片。

bmp=new BitmapFactory().decodeFile(util.getPathFromUri(tempFile));
Bitmap scaledBitmap=Bitmap.createScaledBitmap(bmp, newWidth, newHeight, true); //Line 2
ByteArrayOutputStream bos=new ByteArrayOutputStream();
scaledBitmap.compress(CompressFormat.JPEG, 100, bos);
bmp.recycle();
bmp=null;
OutputStream out;
out = new FileOutputStream(util.getTempFileName());
bos.writeTo(out);
bos.flush();

但有时OutOfMemoryError出现在第2行并且应用程序崩溃,我尝试将此代码封装在try-catch中但仍然我的应用程序崩溃,因为只有例外被try-catch捕获,同样createScaledBitmap()函数只抛出{{1 }}。 因为,我不想显示图像,因此我不需要将其缩小(正如我在SOF中的其他问题中看到的那样)。 那么,如果我使用它(newWidth,newHeight),我怎么能预先检测到OutOfMemoryError会发生。有没有办法计算内存中的(newWidth,newHeight)Bitmap所需的字节数以及可以分配给位图的最大可用内存?

请帮忙!

3 个答案:

答案 0 :(得分:0)

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.RGB_565;
options.inPurgeable = true;
options.inSampleSize = 1;
options.inScaled = false;
options.inDensity = DisplayMetrics.DENSITY_DEFAULT;
options.inTargetDensity = DisplayMetrics.DENSITY_DEFAULT;
options.inScreenDensity = DisplayMetrics.DENSITY_DEFAULT;
new BitmapFactory().decodeFile(util.getPathFromUri(tempFile),options);

答案 1 :(得分:0)

要避免java.lang.OutOfMemory异常,请在解码之前检查位图的尺寸,除非您完全信任该源为您提供可预测大小的图像数据,这些数据可以轻松地放入可用内存中。有关详细信息,请参阅this

答案 2 :(得分:0)

尝试使用此方法调整位图大小:

Bitmap bitmpResizeResult = ThumbnailUtils.extractThumbnail(bitmapWantToResize, width, height);