2013-03-10 22 views
7

Realizzo un'app per Android e ho bisogno di caricare un'immagine (bitmap) in una cava e ridimensionarla utilizzando il gesto "zoom pizzico". Quando l'immagine supera una certa dimensione, tuttavia, l'applicazione si arresta in modo anomalo (eccezione OutOfMemory). Come ottimizzo il caricamento e la manipolazione dell'immagine?Caricamento Android di bitmap di grandi dimensioni

Per caricare l'immagine che uso:

BitmapFactory.decodeResource (ctx.getResources(), R.drawable.image) 

di disegnarlo:

imgCanvas.drawBitmap (image, posX, posY, null), 

Per modificare le sue dimensioni:

Bitmap.createScaledBitmap (originalBitmap, neww, NEWH, true); 

risposta

3

Questo non è banale.

in base alla scala corrente dell'immagine e la parte visibile dell'immagine, caricare solo una parte di tale immagine alla risoluzione appropriata:
https://developer.android.com/reference/android/graphics/BitmapRegionDecoder.html

Quando zoom-out e si desidera visualizzare il intera immagine ridimensionata, utilizzare i metodi di questa classe BitmapRegionDecoder che prendono un parametro BitmapFactory.Options e impostare inSampleSize ad un valore maggiore di 1 (preferibilmente un valore che è una potenza di 2):
https://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize

Quando si ingrandisce, primo ingrandimento la risoluzione più bassa che è già mostrata (dove hai usato un valore di inSampleSize> 1) e carica pigramente una versione con risoluzione maggiore (dove inSampleSize è più piccola del valore precedente usato) usando BitmapRegionDecoder e dissolvenza gradualmente nella versione a risoluzione più alta.

Quando l'utente ingrandisce, continuare a fare questo fino a quando il inSampleSize è 1.

+0

inizialmente ho caricare l'immagine nelle sue dimensioni originali (con inSampleSize = 1). Quando faccio lo "zoom in" devo cambiare in Sampleampize con un valore> 1 e poi ritagliare l'immagine? – Giammy

+0

Prima che l'utente esegua lo zoom, si carica l'intera immagine con inSampleSize> 1. Quindi, quando l'utente esegue lo zoom in avanti, in alcuni punti si caricherà di nuovo l'immagine, ma solo una parte e con un inSampleSize con valore inferiore (ma ancora più di 1). Quando l'utente esegue lo zoom avanti e indietro di nuovo, ad un certo punto, inSampleSize = 1 (e avrai caricato solo la parte che è visibile). –

Problemi correlati