Link

GitHub

Reescalado imagen

Cuando se cargan recursos de imágenes en una aplicación se debe tener en cuenta que no siempre es necesario cargar la imagen en su tamaño original. Las pantallas suelen ser relativamente pequeñas para, por ejemplo, una imagen hecha con una buena cámara, por lo que reducir la imagen al mostrarla en nuestra aplicación mejorará la gestión de recursos del dispositivo. Primeramente, consulta la documentación de Android donde se explica paso a paso el proceso:

Documentación

En el ejemplo reproduciremos los mismos pasos:

1. Seleccionamos una imagen del dispositivo utilizando un intent implícito.

public void reducirFoto(View v) {
    Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intent, REDUCIR);
}

2. Definimos un método para redimensionar la imagen.

public Bitmap reducir(String uri, int ancho, int alto) throws FileNotFoundException {
    BitmapFactory.Options options = new BitmapFactory.Options();
    // Evita cargar toda la fotografía en memoria
    options.inJustDecodeBounds = true;
    // Solo cargamos el tamaño y lo guardamos en options
    BitmapFactory.decodeStream(getContentResolver().openInputStream(Uri.parse(uri)), null, options);
    // Definimos un nuevo tamaño. BitmapFactory solo reduce las imágenes en potencia de 2, por lo que puede variar el resultado
    options.inSampleSize = (int) Math.max(Math.ceil(options.outWidth/ancho), Math.ceil(options.outHeight/alto));
    // Activamos la carga de imagen en memoria
    options.inJustDecodeBounds = false;
    // Cargamos la imagen en memoria.
    return BitmapFactory.decodeStream(getContentResolver().openInputStream(Uri.parse(uri)), null, options);
}

Los parámetros ancho y alto especifican el tamaño máximo de la imagen reducida. inJustDecodeBounds permite cargar los atributos de la imagen sin necesidad de cargarla en memoria. Una vez recuperadas las opciones se modificarán para cambiar el tamaño de la imagen a cargar. Al llamar a decodeStream(), se debe volver a cambiar otra vez el parámetro inJustDecodeBounds para recuperar realmente la imagen con las opciones especificadas.