16

私のコードコードは次のとおりです。

public Bitmap loadPhoto(Uri uri) {
    Bitmap scaled = null;
    try {
    scalled = Bitmap.createBitmap(
      MediaStore.Images.Media.getBitmap(getContentResolver(), uri),
      0,0,90, 90);

    if (scaled == null) { return null; }
    } catch(Exception e) { }
    return scaled;
}

この後。ImageView で拡大縮小して表示します。すべての画像は、デバイスのカメラから取得されます。

毎回、カメラから 3 枚の写真を表示した後、メモリ不足というエラーが発生します。これを解決するには?

4

4 に答える 4

1

MediaStore.getBitmap メソッドは、ビットマップを取得するときにサンプル サイズを指定しない便利なメソッドです。getBitmap(ContentResolver, Uri) を使用していて、サンプル サイズを使用したい場合は、ContentResolver を使用して入力ストリームを取得し、通常どおりビットマップをデコードします (最初にサンプル サイズを計算してから、適切なサンプルサイズ)。

于 2016-03-07T15:53:29.587 に答える
1

コードサンプルを探している人のために:

private 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) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) >= reqHeight
                && (halfWidth / inSampleSize) >= reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

public static Bitmap decodeSampledBitmapFromUri(Context context, Uri imageUri, int reqWidth, int reqHeight) throws FileNotFoundException {

    // Get input stream of the image
    final BitmapFactory.Options options = new BitmapFactory.Options();
    InputStream iStream = context.getContentResolver().openInputStream(imageUri);

    // First decode with inJustDecodeBounds=true to check dimensions
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(iStream, null, options);

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

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeStream(iStream, null, options);
}
于 2016-08-22T14:15:52.453 に答える