【问题标题】:Rotating bitmap causes outOfMemoryException旋转位图导致 outOfMemoryException
【发布时间】:2013-06-14 16:40:37
【问题描述】:

我以这种方式旋转位图,每次单击按钮图像都会旋转 90 度

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

我尝试了很多图像,但现在一个导致 OutOfMemoryError。有没有办法防止这种情况?当然我可以调用回收,但是我丢失了位图并且必须从图像视图中再次获取它。我认为这不会有什么不同。

【问题讨论】:

标签: android bitmap out-of-memory


【解决方案1】:

我有一些建议给你。

1) 当您有任何内存饥饿任务时,请使用 in 方法,如果可能,请使用 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。当这个任务完成时,这个任务使用的所有内存都是空闲的。试试这个方法。我在我的应用程序中使用过。

【讨论】:

  • 这是凌晨 4:00 的救命稻草。
  • 很高兴能帮到你.. :)
【解决方案2】:

如果你只需要查看图片,你可以将一个可旋转的drawable设置为shown here

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

【讨论】:

    【解决方案3】:

    尝试如下:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多