ASánchezDíaz

Autoaprendiendo .NET y otras cosas


Determinar si una imagen está rotada en Android

Esta es mi primera entrada sobre Android.

Ya sé que tal vez la primera entrada debería ser algo menos técnico, pero la realidad es que ha pasado mucho tiempo desde que no escribía y en este tiempo he ido avanzando en la programación para Android.

La filosofía del blog es:

Si aprendo algo nuevo o consigo resolver un problema, lo publico para que me sirva de “recordatorio” y a la vez ayude a otros

Hoy me he visto en la circunstancia de tener que cargar una imagen desde el almacenamiento externo del móvil para mostrarla en un control ImageView.

Fácil pensé, y de hecho lo es, pero algunas fotos, cuando se cargaban en el ImageView aparecían rotadas, es decir, al seleccionarlas desde la galería de Android las veía adecuadamente, pero una vez cargadas, algunas fotos aparecían rotadas 90º.

Intuitivamente comprendí el motivo. Las fotos que se tomaban con el móvil en posición horizontal (landscape) siempre aparecían correctamente, en cambio, cuando la foto se había tomado con el móvil en vertical (portrait) aparecían rotadas. En la galería se veían correctamente porque de algún modo el sistema conocía este dato.

En esta entrada no voy a entrar en detalles sobre cómo cargar una foto desde la galería o la cámara. Prometo que dedicaré una entrada a este tema. Nos centraremos en conocer de qué modo podemos saber no sólo si una imagen está rotada, también los grados de rotación.

Tomaremos como ejemplo estas dos fotos:

Imagen tomada en vertical

Foto tomada en vertical

20160810_234234

Foto tomada en horizontal

 

 

 

 

 

 

 

 

Yo mismo he hecho las fotos hace un momento. La primera, con el móvil en vertical, la segunda en horizontal. Veamos cómo se ven las fotos al seleccionarlas de la galería:

Galería de Android

Galería de Android

Una vez que cargamos las fotos, así se ven en la aplicación:

Foto tomada con la cámara en horizontal

Foto tomada con la cámara en horizontal

Foto tomada con la cámara en vertical

Foto tomada con la cámara en vertical

 

¿Qué ha ocurrido? ¿Por qué pasa esto si en la galería de Android se muestran bien? Bueno, está claro que la aplicación “Galería” controla esto. Vamos a ver cómo podemos hacerlo nosotros también.

La información relacionada con la foto está almacenada en la propia imagen según la especificación EXIF, que digamos que contiene los metadatos de la imagen. Parte de esta información, por ejemplo, podemos verla al desplegar las propiedades de la imagen y ver sus detalles. Estos metadatos almacenan información, entre otra, acerca del modelo de la cámara, fecha, compresión, resolución… incluso si se disparó el flash y, afortunadamente, la información acerca de la orientación de la imagen.

En Android podemos usar el siguiente método, que nos devolverá los grados de rotación que tiene la imagen.

    public float getImageRotation(Uri path, Context context) {
        try {
            String[] projection = {MediaStore.Images.ImageColumns.ORIENTATION};

            Cursor cursor = context.getContentResolver().query(path, projection, null, null, null);

            if (cursor.moveToFirst()) {
                return cursor.getInt(0);
            }
            cursor.close();

        } catch (Exception ex) {
            return 0f;
        }

        return 0f;
    }
 
 

Lo que hemos hecho es construir un objeto Cursor que nos permitirá leer la información almacenada en la imagen.

La línea:


String[] projection = {MediaStore.Images.ImageColumns.ORIENTATION};
 
 

determina las columnas que nos interesan.

Es interesante conocer las clases ContentProvider y ContentResolver.

Es parecido (en la práctica igual) que acceder a una base de datos. Podemos imaginar que estamos accediendo a una tabla de una base de datos.

La línea:

Cursor cursor = context.getContentResolver().query(path, projection, null, null, null);
 
 

Crea el objeto Cursor que leerá la información solicitada, en este caso sólo nos interesan los grados de rotación. Puedes pulsar aquí para obtener más información del método query.

Situamos el objeto cursor en el primer registro y devolvemos los grados de rotación de la imagen. Si ocurre cualquier error o excepción o no se encuentra la información, el método devuelve 0.

Ahora que ya conocemos los grados de rotación de la imagen, podemos usar esta información para colocar la imagen correctamente.

Esto (y otras tareas de manipulación de imágenes) lo haremos con la clase Matrix, aunque eso será en otra entrada.

 

Saludos.

Un comentario - Deja un comentario
  • Deja un comentario

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *