旋转位图导致内存溢出异常

8

我这样旋转位图,在每次按钮点击时,图像会旋转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中获取。我不认为这会有什么区别。

1
这个能帮到您吗?http://developer.android.com/training/displaying-bitmaps/index.html - Bertie Wheen
如果旋转ImageView是一种替代方案,那就选择它吧! - Carnal
旋转ImageView并不是一个选项,我之后保存位图。虽然在其他情况下,这可能是更好的选择。 - Raymond P
3个回答

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
这是凌晨4点的救命稻草。 - ichthyocentaurs
很高兴能帮到你.. :) - Chintan Rathod

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);

0

如果您只需要查看图像,可以将旋转Drawable设置为此处显示

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接