lunes, 11 de junio de 2012

Evitando OOM procesando bitmaps

Cuando trabajamos con el procesamiento de imágenes en Android, uno de los principales problemas que nos encontramos es el ya (para mí) típico: "java.lang.OutOfMemoryError: bitmap size exceeds VM budget". Normalmente, este error suele pasar cuando estamos realizando la siguiente acción:
   Bitmap bitmap = BitmapFactory.decodeFile(fileName);
Una opción que en mis proyectos ha funcionado es implementar este método de la siguiente forma:
    private Bitmap decodeFile(File f){
        try {
            //Decode image size
            BitmapFactory.Options o=new BitmapFactory.Options();
            o.inSampleSize = 8;
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f),null,o);

            //The new size we want to scale to
            final int REQUIRED_SIZE=70;

            //Find the correct scale value. It should be the power of 2.
            int scale=1;
            while(o.outWidth/scale/2>=REQUIRED_SIZE && o.outHeight/scale  /2>=REQUIRED_SIZE)
                scale*=2;

            //Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize=scale;
            return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        } catch (FileNotFoundException e) {}
        return null;
    }


 Esta función, funciona en la mayoría de los casos y terminales. En caso que tengáis algun problema, se puede solucionar cambiando los valores de los parámetros:
 - o.inSampleSize;
 - REQUIRED_SIZE;


It works!


Roger Sala,

2 comentarios:

  1. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar
  2. cuando uso muchos image view se me produce este error y la app se me cierra.
    Me podrias ayudar a que no tenga ese molesto error ?

    ResponderEliminar