2010-02-19 12 views
5

Ho bisogno di scattare una foto con la fotocamera e, se a seconda delle dimensioni dell'immagine, ruotarla prima di salvarla nella galleria.Come lavorare con bitmap di grandi dimensioni. Rotazione e inserimento nella galleria

sto usando

Intent imageCaptureIntent = new Intent (MediaStore.ACTION_IMAGE_CAPTURE); imageCaptureIntent.putExtra (MediaStore.EXTRA_OUTPUT, uri); startActivityForResult (imageCaptureIntent, IMAGE_CAPTURE);

Per scattare la foto e salvarla in un file temporaneo.

Poi

bitmap BMP = BitmapFactory.decodeFile (imagePath);
String str = android.provider.MediaStore.Images.Media.insertImage (cr, bmp, nome, descrizione);

Per salvarlo.

Questo è il codice che cercato di utilizzare per ruotare l'immagine bitmap

matrice Matrix = new Matrix();
matrix.postRotate (180);
Bitmap x = Bitmap.createBitmap (bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrice, vero);
android.provider.MediaStore.Images.Media.insertImage (cr, x, nome, descrizione);

Il problema è che sto ricevendo un OutOfMemoryException.

Esiste un modo migliore per gestire le bitmap per evitare di rompere la memoria?

~ Grazie in anticipo, saluti

risposta

2

non credo che ci sia un modo migliore per gestire le bitmap. Potresti provare ad analizzare i dati direttamente da un file come Byte [] una porzione alla volta e manipolarla in pezzi; è difficile e probabilmente finirai con un codice molto brutto.

Ho anche suggerire la seguente:

  • Uso android.provider.MediaStore.Images.Media.insertImage(cr, imagePath, name, description) invece di android.provider.MediaStore.Images.Media.insertImage(cr, bmp, name, description) in questo modo non c'è bisogno di chiamare Bitmap bmp = BitmapFactory.decodeFile(imagePath) e non bitmap verrà caricato in memoria in quel punto.

  • In tutto il codice, assicurarsi che nessun bitmap sia caricato se non necessario. Impostare bitmap che non sono più necessarie per null e chiamare il garbage collector o utilizzare bmp.recycle().

+0

bmp.recycle() wont help here cuz puoi davvero farlo bene DOPO aver catturato OOM. Voglio dire dopo aver ruotato bitmap e averlo salvato. Tuttavia, l'OOM probabilmente arriva in un momento rotante dal momento che deve conservare 2 stessi bitmap nella RAM. – Stan

0

Ho avuto lo stesso problema con bitmap rotante. Il problema qui:

Bitmap bmp = BitmapFactory.decodeFile(imagePath); //this is the image you want to rotate 
    // keeping in mind that you want to rotate the whole original image instead 
    // of its downscaled copy you cant use BitmapFactory downscaling ratio 
    Matrix matrix = new Matrix(); 
    matrix.postRotate(180); 
    Bitmap x = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true); 
    // the line above creates another bitmap so we have here 2 same sized bitmaps 
    // even using the same var (bmp instead of x) wont change anything here 
    // so you gonna get the OOM here 

è che crea 2 bitmap in modo che vogliono x2 più RAM.
Controllare my question and solution here. Scommetto per ImageMagick lib.

Problemi correlati