1

我需要让用户从他们的画廊中打开一个特定的相册,并让他们对图像做一些事情。

为了从相册中检索图像,我正在使用:
Bitmap bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri).

一切正常,除了如果相册包含许多图片,它最终会出现OutOfMemoryException.
现在,我知道如何根据Android 指南缓解这个问题,但问题是我已经在检索原始位图getBitmap()

那么,是否有可能以字节数组格式或输入流格式检索图像,并在将其分配到内存之前将其缩小以避免内存泄漏?(以与 Android 指南建议相同的方式)

4

2 回答 2

0

您已经确定了一个非常好的解决方案。如果您想跳过Bitmap通过将图像拉入 a 的步骤MediaStore,请尝试使用ImageView.setImageUri()

于 2012-07-27T10:59:43.993 回答
0

因此,Uri在我手中有一张图像,我想检索它InputStream并缩小图像,然后再将其分配到内存中以避免OutOfMemoryException

解决方案:
要从 Uri 中检索 InputStream,您必须调用:

InputStream stream = getContentResolver().openInputStream(uri);

然后按照 Android 关于高效加载位图的建议,您只需要调用BitmapFactory.decodeStream(),并将其BitmapFactory.Options作为参数传递。

完整源代码:

imageView = (ImageView) findViewById(R.id.imageView);

Uri uri = Uri.parse("android.resource://com.testcontentproviders/drawable/"+R.drawable.test_image_large);
Bitmap bitmap=null;
    try {
        InputStream stream = getContentResolver().openInputStream(uri);
        bitmap=decodeSampledBitmapFromStream(stream, 150, 100);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

imageView.setImageBitmap(bitmap);

辅助方法:

public static Bitmap decodeSampledBitmapFromStream(InputStream stream,
            int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(stream, null, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth,
                reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeStream(stream, null, options);
}

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;

    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;
}
于 2012-07-27T11:46:33.517 回答