6

我在一个 android 应用程序中工作,我正在使用位图将图像绑定到 ImageView。我的要求是旋转那个 ImageView 并给那个 ImageView 一个边框。我已经成功实现了这一点,但是在应用程序使用此活动两三次后,出现“强制关闭”错误,提示 Bitmap out of VM memory。请帮助我尽量减少代码中的位图内存消耗。并让我知道如何修改相同的代码?

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 回答
0

只需在清单文件中添加 android:largeHeap="true"

参考: largeHeap=true 清单标签不起作用?

于 2013-07-09T10:24:14.620 回答