Autore Topic: CreateScaledBitmap o decodeFile????  (Letto 556 volte)

Offline qualcuno

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Google+
    • Mostra profilo
    • Ingegnere Informatico Blog
CreateScaledBitmap o decodeFile????
« il: 29 Febbraio 2012, 12:02:20 CET »
0
Salve a tutti avrei un dubbio sulla gestione delle bitmap...
sto sviluppando una galleria, e carico le thumb delle immagini nel seguente metodo:

Codice (Java): [Seleziona]
public Bitmap getImgFromSd(String nomeFile)
        {
                BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 4;
                return ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(pathImgSd+nomeFile,options), 150, 150);
        }

testando l'applicazione ho notato che se dovessi togliere l'options ottengo un OutOfMemory...
girando sul web ho capito che le immagini occupano in ram uno spazio pari a width*height*4 (4 per ogni pixel)

allora da questo metodo deduco che le immagini del mio device (che sono oltre i 3000 px) se caricate con le dimensioni originali sono troppo
grandi per la memoria del telefono, e quindi l'options su scritto viene in aiuto caricando in memoria l'immagine con un quarto delle dimensioni in pixel.

A questo punto mi viene un altro dubbio:
sempre nella mia applicazione quando si visualizza l'immagine in full screen adotto il seguente metodo:

Codice (Java): [Seleziona]
public Bitmap getImgFromSd(String nomeFile, int widthToScale, int heightToScale)
        {
                int newW;
                int newH;
                double scala=2;
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds=true;
                BitmapFactory.decodeFile(pathImgSd+nomeFile, options);
       
                int w=options.outWidth;
                int h=options.outHeight;
               
           if(w>h)
                {
                        scala=((double) widthToScale)/w;
                       
                }
                else if(h>w)
                {
                        scala=heightToScale/h;
                       
                }
                if(scala<1)
                {
                        newW=(int) (scala*w);
                        newH=(int) (scala*h);
                       
                }
                else
                {
                        newW=w;
                        newH=h;
                }
       
               
                Bitmap m= Bitmap.createScaledBitmap(BitmapFactory.decodeFile(pathImgSd+nomeFile), newW, newH, false);
                return m;
       
               
        }

dove nel primo decodeFile carico l'immagine senza istanziarla, solo per ottenere le informazioni che utilizzo poi per calcolarmi il coefficiente di scala.

A questo punto mi sovviene la domanda, perchè nel successivo createScaledBitmap non ottengo un outOfMemory???? in teoria dovrei ottenerlo perchè RiEseguo il decodeFile dell'immagine originale... quindi dovrebbe occupare la stessa memoria della precedente....


qualcuno che mi spiega tutto ciò?! o se c'è qualche guida che mi possa venire in aiuto?!