旋转位图会导致outOfMemoryException

时间:2013-06-18 12:50:49

标签: android bitmap out-of-memory

我以这种方式旋转位图,在每个按钮上单击图像旋转90度

Matrix matrix = new Matrix();
matrix.postRotate(90);
rotated = Bitmap.createBitmap(rotated, 0, 0,
        rotated.getWidth(), rotated.getHeight(), matrix, true);
iv.setImageBitmap(rotated);

我用很多图片试过这个,但是现在一个引起了OutOfMemoryError。有办法防止这种情况吗?当然我可以调用recycle,但后来我丢失了位图并且必须从imageview再次获取它。我认为这不会有任何区别。

3 个答案:

答案 0 :(得分:13)

我有你的建议。

1)当您有任何记忆饥饿任务时,请使用方法,如果可能,请使用AsyncTask 2)将对象声明为WeakReference。这将使您有机会在使用后释放内存。见下面的例子。

public class RotateTask extends AsyncTask<Void, Void, Bitmap> {
    private WeakReference<ImageView> imgInputView;
    private WeakReference<Bitmap> rotateBitmap;

    public RotateTask(ImageView imgInputView){
        this.imgInputView = new WeakReference<ImageView>(imgInputView);
    }

    @Override
    protected void onPreExecute() {
        //if you want to show progress dialog
    }

    @Override
    protected Bitmap doInBackground(Void... params) {
        Matrix matrix = new Matrix();
        matrix.postRotate(90);
        rotateBitmap = new WeakReference<Bitmap>(Bitmap.createBitmap(rotated, 0, 0,rotated.getWidth(), rotated.getHeight(), matrix, true));
        return rotateBitmap.get();
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        //dismiss progress dialog
        imgInputView.get().setImageBitmap(result);
    }
}

此任务将所有视图和对象都设为WeakReference。完成此任务后,此任务使用的所有内存都是空闲的。试试这种方法。我在我的申请中使用过。

答案 1 :(得分:0)

尝试如下:

Matrix matrix = new Matrix();
matrix.postRotate(90);
rotated = Bitmap.createBitmap(rotated, 0, 0,rotated.getWidth(), rotated.getHeight(), matrix, true);
ByteArrayOutputStream bmpStream = new ByteArrayOutputStream();
rotated.compress(Bitmap.CompressFormat.JPEG,100, bmpStream);
iv.setImageBitmap(rotated);

答案 2 :(得分:0)

如果您只需要查看图像,可以将旋转绘图设置为shown here

如果您关心位图的真实旋转,并且您还想避免OOM,请检查this link