旋转位图时发生java.lang.OutOfMemoryError

旋转位图时发生java.lang.OutOfMemoryError,java,android,layout,bitmap,Java,Android,Layout,Bitmap,我正在尝试将给定位图旋转X度 以便将其发送到我的服务器 我使用的是安卓API8 使用此代码: private static void rotateBitmap(Bitmap source, float angle) { Matrix matrix = new Matrix(); matrix.postRotate(angle); return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(),

我正在尝试将给定位图旋转X度 以便将其发送到我的服务器

我使用的是安卓API8

使用此代码:

  private static void rotateBitmap(Bitmap source, float angle) {
 Matrix matrix = new Matrix();
 matrix.postRotate(angle);
 return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix,
  true);
  }
 private static void rotateBitmap(Bitmap source, float angle) {
// Matrix matrix = new Matrix();
// matrix.postRotate(angle);
// return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix,
// true);

// Bitmap workingBitmap = Bitmap.createBitmap(source);

Bitmap mutableBitmap = source.copy(Bitmap.Config.ARGB_8888, true);
source.recycle();
// Canvas canvas = new Canvas(mutableBitmap);
Canvas canvas = new Canvas();

// Canvas canvas = new Canvas(source);
Matrix matrix2 = new Matrix();
matrix2.setRotate(angle, mutableBitmap.getWidth() / 2, mutableBitmap.getHeight() / 2);
canvas.drawBitmap(mutableBitmap, matrix2, new Paint());
它在Nexus 5上工作,但在Galaxy Note2上,我得到以下错误:

05-18 09:06:42.696: E/AndroidRuntime(6044): java.lang.OutOfMemoryError
05-18 09:06:42.696: E/AndroidRuntime(6044):     at android.graphics.Bitmap.nativeCreate(Native Method)
05-18 09:06:42.696: E/AndroidRuntime(6044):     at android.graphics.Bitmap.createBitmap(Bitmap.java:726)
05-18 09:06:42.696: E/AndroidRuntime(6044):     at android.graphics.Bitmap.createBitmap(Bitmap.java:703)
05-18 09:06:42.696: E/AndroidRuntime(6044):     at android.graphics.Bitmap.createBitmap(Bitmap.java:636)
我在SOF上读过一些帖子

并更改为以下代码:

  private static void rotateBitmap(Bitmap source, float angle) {

    Canvas canvas = new Canvas(source);
    Matrix matrix2 = new Matrix();
    matrix2.setRotate(angle, source.getWidth() / 2, source.getHeight() / 2);
    canvas.drawBitmap(source, matrix2, new Paint());
  }
但是我得到了以下错误:

05-18 09:06:42.696: E/AndroidRuntime(6044): java.lang.OutOfMemoryError
05-18 09:06:42.696: E/AndroidRuntime(6044):     at android.graphics.Bitmap.nativeCreate(Native Method)
05-18 09:06:42.696: E/AndroidRuntime(6044):     at android.graphics.Bitmap.createBitmap(Bitmap.java:726)
05-18 09:06:42.696: E/AndroidRuntime(6044):     at android.graphics.Bitmap.createBitmap(Bitmap.java:703)
05-18 09:06:42.696: E/AndroidRuntime(6044):     at android.graphics.Bitmap.createBitmap(Bitmap.java:636)
传递给画布构造函数的不可变位图

更新

然后我尝试了以下代码:

  private static void rotateBitmap(Bitmap source, float angle) {
 Matrix matrix = new Matrix();
 matrix.postRotate(angle);
 return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix,
  true);
  }
 private static void rotateBitmap(Bitmap source, float angle) {
// Matrix matrix = new Matrix();
// matrix.postRotate(angle);
// return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix,
// true);

// Bitmap workingBitmap = Bitmap.createBitmap(source);

Bitmap mutableBitmap = source.copy(Bitmap.Config.ARGB_8888, true);
source.recycle();
// Canvas canvas = new Canvas(mutableBitmap);
Canvas canvas = new Canvas();

// Canvas canvas = new Canvas(source);
Matrix matrix2 = new Matrix();
matrix2.setRotate(angle, mutableBitmap.getWidth() / 2, mutableBitmap.getHeight() / 2);
canvas.drawBitmap(mutableBitmap, matrix2, new Paint());
}

得到了这个错误:

05-18 09:42:17.906: E/AndroidRuntime(18788): java.lang.OutOfMemoryError
05-18 09:42:17.906: E/AndroidRuntime(18788):    at android.graphics.Bitmap.nativeCopy(Native Method)
05-18 09:42:17.906: E/AndroidRuntime(18788):    at android.graphics.Bitmap.copy(Bitmap.java:479)

如何修复此问题?

您没有回收所有位图。
回收后,您必须删除所有链接到位图的指针。

请发布完整的日志。请参见:@Domin谢谢。请看我的更新所有位图都有问题吗?你需要旋转位图做什么?在SD卡上存钱?在画布上绘图?只需将位图变量设置为null。