我创建了一个小应用程序,可以处理来自图库或相机的图像。
一切正常,但是。 在小屏幕和小内存大小的设备上(HTC Desire)我从其他手机上下载了一些全尺寸的图像,它们要大得多(手机上的800万像素摄像头)。
如果我尝试加载它,对于我的小相机巨大的图像,它会立即崩溃。
那么,如何实现某种检查并缩小图像尺寸,但仍能正确加载?
我会在加载后缩小图像,但这应该在崩溃出现之前完成。
TNX。
InputStream in = null;
try {
in = getContentResolver().openInputStream(data.getData());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// get picture size.
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(in, null, options);
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// resize the picture for memory.
int screenH = getResources().getDisplayMetrics().heightPixels; //800
int screenW = getResources().getDisplayMetrics().widthPixels; //480
int width = options.outWidth / screenW;
int height = options.outHeight / screenH;
Log.w("Screen Width", Integer.toString(width));
Log.w("Screen Height", Integer.toString(height));
int sampleSize = Math.max(width, height);
options.inSampleSize = sampleSize;
options.inJustDecodeBounds = false;
try {
in = getContentResolver().openInputStream(data.getData());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// convert to bitmap with declared size.
Globals.INSTANCE.imageBmp = BitmapFactory.decodeStream(in, null, options);
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 0 :(得分:1)
只需设置
,就可以避免在内存中加载位图inJustDecodeBounds = true
inJustDecodeBounds将允许您仅解码图像的边界而不对其进行解码。给定位图的height
和width
,您可以使用下采样。
:
如果设置为值> 1,请求解码器对原始进行二次采样 图像,返回较小的图像以节省内存。
int tmpWidth = bitmapWidth;
int tmpHeight = bitmapHeigth;
int requiredSize = ...
while (true) {
if (tmpWidth / 2 < requiredSize
|| tmpHeight / 2 < requiredSize)
break;
tmpWidth /= 2;
tmpHeight /= 2;
ratio *= 2;
}
编辑:对于32位Bitmap
,所需的内存为width * height * 4