2013-06-18 15 views
7

sto girando una bitmap in questo modo, ad ogni tasto clicca l'immagine ruota di 90 gradirotazione bitmap provoca OutOfMemoryException

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

ho provato questo con un sacco di immagini, ma ora uno ha causato un OutOfMemoryError. C'è un modo per impedirlo? Ovviamente posso chiamare il riciclo, ma poi perdo la bitmap e devo riprenderla dall'immageview. Non penso che farà alcuna differenza.

+1

Potrebbe questo aiuto? http://developer.android.com/training/displaying-bitmaps/index.html –

+0

Se ruotare ImageView è un'alternativa, segui questo! – Carnal

+0

La rotazione di ImageView non è un'opzione, salvo il bitmap in seguito. Anche se in altre situazioni è un'opzione migliore. –

risposta

13

Ho suggerimenti per voi.

1) Se si dispone di un problema di memoria, utilizzare in metodi e, se possibile, con AsyncTask.
2) Dichiarare oggetti come WeakReference. Questo ti darà la possibilità di rilasciare memoria dopo l'uso. Vedi sotto l'esempio.

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

Questo compito è tutti i punti di vista e l'oggetto come WeakReference. Al termine di questa attività, tutta la memoria utilizzata da questa attività è gratuita. Prova questo approccio. Ho usato nella mia applicazione.

+1

Questo è un salvavita alle 4:00 del mattino. – Ichthyocentaurs

+0

Felice che ti abbia aiutato .. :) –

0

Prova come di seguito:

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

Ho bisogno di mantenere il formato PNG. Ma grazie comunque. –

0

Se è necessario solo visualizzare le immagini, è possibile impostare un disegnabile rotazione come shown here

Se avete a cuore vero e proprio di rotazione della bitmap, e anche voi volete per evitare OOM, controllare this link

Problemi correlati