2012-05-18 5 views
0

Я пытаюсь повернуть Img (растровое изображение) по сводному коду. его рабочий штраф до 5-6 оборотов, после чего я получаю OME?Получение OME во время поворота Растровое изображение

private void rotateImg() { 
    Matrix matrix = new Matrix(); 
    matrix.postScale(curScale, curScale); 
    matrix.postRotate(curRotate); 
    try { 
     temp = Bitmap.createBitmap(temp, 0, 0, temp.getWidth(), 
       temp.getHeight(), matrix, true); 
     setImage.setImageBitmap(temp); 
    } catch (OutOfMemoryError e) { 
     curRotate = curRotate - 45.0f; 
     Toast.makeText(this,"Out Of Memory",Toast.LENGTH_LONG).show(); 
    } 
} 

здесь «test» - это статический файл растрового изображения, загружаемый с SDCard.

ответ

1

Почему вы создаете растровое изображение каждый раз? Есть ли какая-то конкретная причина? Если не использовать следующий код:

private void rotateImg() { 
    int cx = temp.getWidth()/2; 
    int cy = temp.getHeight()/2; 
    matrix.preTranslate(-cx, -cy); 
    matrix.postRotate(curRotate); 
    matrix.postTranslate(cx, cy); 
    setImage.setImageMatrix(matrix); 
} 
0

Возможно, вам придется использовать метод bitmap.recycle() каждый раз, когда вы вызываете этот метод. Попробуйте что-то вроде этого:

private void rotateImg() { 
    Matrix matrix = new Matrix(); 
    matrix.postScale(curScale, curScale); 
    matrix.postRotate(curRotate); 
    try { 
     temp.recycle(); //removes the memory occupied by this bitmap object 
      temp=null; 
     temp = Bitmap.createBitmap(temp, 0, 0, temp.getWidth(), 
       temp.getHeight(), matrix, true); 
     setImage.setImageBitmap(temp); 
    } catch (OutOfMemoryError e) { 
     curRotate = curRotate - 45.0f; 
     Toast.makeText(this,"Out Of Memory",Toast.LENGTH_LONG).show(); 
    } 
} 
+0

, но я использую этот файл «Темп» в следующей строке, чтобы создать новый Bitmap, я думаю, что мы можем получить некоторые ошибки с этим кодом «пытается использовать переработанную точечный рисунок» – user1395885

+0

О, хорошо. можете добавить эти строки после setImage.setImageBitmap (temp); вместо этого и проверить. –

1

Первый ответ, вероятно, является одним из возможных решений. Проблема здесь в том, что вы создаете много объектов Bitmap, которые довольно большие, и они не получают gc'd по любой причине.

Лучшим решением может быть использование одного растрового изображения и применение поворота/масштабирования при его рисовании. Например, если вы рисовали Canvas, входящий в состав View, rotateImg мог просто повернуть матрицу и вызвать invalidate на вид, а затем в методе вида onDraw вы должны использовать void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint) на холсте для рендеринга растрового изображения. Документы: here.

Смежные вопросы