2013-06-18 10 views
7

ich auf diese Weise eine Bitmap am rotierenden, auf jeder Taste dreht das Bild klicken 90 GradRotierende Bitmap verursacht OutOfMemoryException

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

Ich habe versucht, dies mit vielen Bildern, aber jetzt man eine OutOfMemoryError verursacht. Gibt es einen Weg dies zu verhindern? Natürlich kann ich Recycling nennen, aber dann verliere ich die Bitmap und muss sie wieder aus der Bildansicht holen. Ich glaube nicht, dass das einen Unterschied machen wird.

+1

Könnte diese Hilfe? http://developer.android.com/training/displaying-bitmaps/index.html –

+0

Wenn das ImageView eine Alternative ist, gehen Sie damit! – Carnal

+0

Das Drehen des ImageView ist keine Option, ich speichere das Bitmap danach. In anderen Situationen ist es jedoch eine bessere Option. –

Antwort

13

Ich habe Vorschläge für Sie.

1) Wenn Sie eine Speicherhungeraufgabe haben, verwenden Sie Methoden und wenn möglich mit AsyncTask.
2) Deklarieren Sie Objekte als WeakReference. Dies gibt Ihnen die Chance, Speicher nach Gebrauch freizugeben. Siehe folgendes Beispiel.

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

Diese Aufgabe hat, alle Ansichten und Objekt als WeakReference. Wenn diese Task abgeschlossen ist, ist der gesamte von dieser Task belegte Speicher frei. Versuchen Sie diesen Ansatz. Ich habe in meiner Bewerbung verwendet.

+1

Dies ist ein Lebensretter um 4:00 Uhr morgens. – Ichthyocentaurs

+0

Froh, dass dir geholfen .. :) –

0

Versuchen wie unten:

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

Ich muss das PNG-Format behalten. Danke trotzdem. –

0

Wenn Sie nur die Bilder sehen müssen, Sie drehen ziehbar als shown here

einstellen Wenn Sie echte Drehung der Bitmap kümmern, und auch Sie wollen Um OOM zu vermeiden, überprüfen Sie this link