4

カメラのインテントから撮影した画像を回転しようとしonActivityResult()ていますが、時々メモリ不足エラーが発生します。

このコードを最適化するにはどうすればよいですか?

http://pastebin.com/ieaHS8qB

bmp = BitmapFactory.decodeStream(new FileInputStream(f), null, null);
correctBmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), 
                bmp.getHeight(), mat, true);

bmp.recycle()これらの行の後にandを追加しようとしましcorrectBmp.recycle()たが、役に立ちませんでした。

4

2 に答える 2

2

アプリケーション API レベル 10+ を開発する場合は、マニフェストを追加できます。

 android:largeHeap="true" //add this entity.

お気に入り

  <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >

またはこれを試してください(クラスの作成)

   public Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
        int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

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

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, 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-11-16T15:29:24.743 に答える
1

デコードストリームの前に以下のコードを追加し、オプションをパラメーターとして渡すようにしてください。

BitmapFactory.Options options = new BitmapFactory.Options();                
options.inSampleSize = 5;               
options.inPurgeable = true;             
options.inInputShareable = true;


bmp = BitmapFactory.decodeStream(new FileInputStream(f),null, options);
于 2012-11-16T15:27:14.283 に答える