这是经典问题,但我没有找到答案。我在我的项目中使用位图。应用过滤器,裁剪..问题是内存不足。我需要在ram上保留许多位图(大约20-30位图)。
我使用此方法在图库中连续获取图像,但它不是原始尺寸。
public static Bitmap getImageWithoutOutOfMemory(String filePath,int requiredSize) {
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
o.inMutable = true;
o.inPreferredConfig = Bitmap.Config.ARGB_8888;
BitmapFactory.decodeFile(filePath, o);
// The new size we want to scale to
final int REQUIRED_SIZE = requiredSize;
// Find the correct scale value. It should be the power of 2.
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true)
{
if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
Bitmap img = BitmapFactory.decodeFile(filePath, o2);
return img;
}
那么如何在没有内存异常的情况下获得原始图像。
答案 0 :(得分:0)
当前形式的函数选择的大小可确保图像缩放到严格小于所需大小。 在租约变更时:
if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE) break;
到
if (width_tmp <= REQUIRED_SIZE && height_tmp <= REQUIRED_SIZE) break;
如果图像自然是&#39;如果需要大小,它实际上会返回一半大小。
如果还有其他问题,请发布MVCE。
答案 1 :(得分:0)