1

ユーザーにギャラリーから特定のアルバムを開いてもらい、画像を使って何かをさせてもらう必要があります。

アルバムから画像を取得するために、私は以下を使用しています。
Bitmap bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri).

アルバムに多くの写真が含まれていると、 AndroidのガイドラインOutOfMemoryException.
に 基づいてこの問題を軽減する方法を知っているという事実を除いて、すべてが正常に機能しますが、問題は、元のビットマップをすでに取得していることです。getBitmap()

それで、バイト配列形式または入力ストリーム形式で画像を取得し、メモリリークを回避するためにメモリに割り当てる前に縮小する可能性はありますか?(Androidガイドラインのアドバイスと同じように)

4

2 に答える 2

0

あなたはすでに非常に良い解決策を特定しました。Bitmapを介して画像をにプルする手順をスキップする場合は、 ImageView.setImageUri()MediaStoreを使用してみてください。

于 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 に答える