0

休閑中のコードでImg(Bitmap)を回転させようとしています。5〜6回転まで正常に動作し、その後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();
    }
}

ここで「テスト」はSDカードからロードされた静的ビットマップファイルです。

4

3 に答える 3

1

最初の答えはおそらく1つの潜在的な解決策です。ここでの問題は、かなり大きなビットマップオブジェクトを多数作成していて、何らかの理由でそれらがgcされていないことです。

より良い解決策は、単一のビットマップを使用し、それを描画するときに回転/スケーリングを適用することです。たとえば、Canvasの一部であるを描画している場合View、rotateImgはマトリックスを回転させてビューを呼び出すだけinvalidateで、ビューのonDrawメソッドvoid drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint)ではキャンバス上でビットマップをレンダリングします。ドキュメントはこちらです。

于 2012-05-18T11:37:03.020 に答える
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);
}
于 2012-05-28T05:06:48.050 に答える
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();
    }
}
于 2012-05-18T11:24:24.970 に答える