6

私はAndroidアプリケーションで作業しており、ビットマップを使用して画像をImageViewにバインドしています。私の要件は、そのImageViewを回転させ、そのImageViewに境界線を付けることです。これは正常に実装されましたが、アプリケーションがこのアクティビティを2〜3回使用すると、「強制終了」エラーが表示され、VMメモリからビットマップが不足しています。コード内のビットマップメモリ​​の消費を最小限に抑えるのを手伝ってください。そして、同じようにコードを変更する方法を教えてください。

final int BORDER_WIDTH = 5;
        // Set the border color
        final int BORDER_COLOR = Color.WHITE;
        Bitmap res = Bitmap.createBitmap(CAPTURE_IMAGE.getWidth() + 2
                * BORDER_WIDTH, CAPTURE_IMAGE.getHeight() + 2 * BORDER_WIDTH,
                CAPTURE_IMAGE.getConfig());
        System.gc();
        Canvas canvas = new Canvas(res);
        Paint paint = new Paint();
        paint.setColor(BORDER_COLOR);
        canvas.drawRect(0, 0, res.getWidth(), res.getHeight(), paint);

        canvas.drawBitmap(CAPTURE_IMAGE, BORDER_WIDTH, BORDER_WIDTH, paint);
        Matrix mat = new Matrix();
        // Set the Imageview position
        mat.postRotate(355);

        bMapRotate = Bitmap.createBitmap(res, 0, 0, res.getWidth(),
                res.getHeight(), mat, true);
        System.gc();
        res.recycle();
        res = null;
        paint = null;
        canvas = null;
        mat = null;
        // Set the captured bitmap image in the imageview
        mShareImageView.setImageBitmap(bMapRotate);
4

4 に答える 4

3

mainfest ファイルに ---> android:largeHeap:"true" を追加します。

于 2013-05-10T07:42:42.797 に答える
3

このような縮小機能を使用する必要があると思います

bMapRotate = Bitmap.createBitmap(res, 0, 0, res.getWidth(),
                res.getHeight(), mat, true);


Bitmap myBitmap = ShrinkBitmap(bMapRotate , 300, 300);

mShareImageView.setImageBitmap(myBitmap );


private Bitmap ShrinkBitmap(String file, int width, int height) {
        // TODO Auto-generated method stub
        BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
        bmpFactoryOptions.inJustDecodeBounds = true;
        Bitmap bitmap = BitmapFactory.decodeFile(file, bmpFactoryOptions);

        int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)height);
        int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)width);

        if (heightRatio > 1 || widthRatio > 1)
        {
         if (heightRatio > widthRatio)
         {
          bmpFactoryOptions.inSampleSize = heightRatio;
         } else {
          bmpFactoryOptions.inSampleSize = widthRatio;
         }
        }

        bmpFactoryOptions.inJustDecodeBounds = false;
        bitmap = BitmapFactory.decodeFile(file, bmpFactoryOptions);
     return bitmap;
    }

それは私にとってはうまくいき、Bitmap out of VM memory例外を回避しました

于 2012-07-23T07:32:10.473 に答える
1

gc()通話を最後に移動してみてください。res = null未使用のメモリを解放できるように設定した後に実行する必要があります。

    res.recycle();
    res = null;
    paint = null;
    canvas = null;
    mat = null;
    System.gc();
于 2012-07-23T07:45:13.260 に答える