首先,我已经阅读了很多关于内存不足异常的帖子和文章,但没有一篇对我的情况有所帮助。我要做的是从 sd 卡加载图像,但将其缩放到精确的像素大小。
我首先获取图像的宽度和高度并计算样本大小:
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(backgroundPath, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, getWidth(), getHeight());
这是我获得样本量的方法(尽管它并不真正相关):
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
// NOTE: we could use Math.floor here for potential better image quality
// however, this also results in more out of memory issues
if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float)height / (float)reqHeight);
} else {
inSampleSize = Math.round((float)width / (float)reqWidth);
}
}
return inSampleSize;
}
现在我有了一个样本大小,我将图像从磁盘加载到近似大小(样本大小):
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
options.inPurgeable = true;
Bitmap bmp = BitmapFactory.decodeFile(backgroundPath, options);
现在,我将创建的这个位图缩放到我需要的确切大小并清理:
// scale the bitmap to the exact size we need
Bitmap editedBmp = Bitmap.createScaledBitmap(bmp, (int) (width * scaleFactor), (int) (height * scaleFactor), true);
// clean up first bitmap
bmp.recycle();
bmp = null;
System.gc(); // I know you shouldnt do this, but I'm desperate
上述步骤通常是让我的内存不足异常。有谁知道从磁盘加载精确大小的位图以避免像上面那样创建两个单独的位图的方法?
此外,当用户第二次运行此代码(设置新图像)时,似乎会发生更多异常。但是,我确保卸载从位图创建的可绘制对象,以便在再次运行此代码之前对其进行垃圾收集。
有什么建议么?
谢谢,尼克