¿Qué es ExifInterface en Android?

Hacemos un uso significativo de las imágenes en nuestras aplicaciones. Para algunas aplicaciones relacionadas con imágenes, toda la información de la imagen es necesaria. Sin embargo, no siempre podemos leer las características de la imagen inmediatamente de la imagen. Puede haber un requisito para conocer la información de la imagen, como la posición del GPS, la fecha/hora, la configuración en el momento de la captura, la orientación, etc. Anteriormente, teníamos que extraer metadatos de diferentes técnicas individualmente y leerlos para comprender los atributos de la imagen. Incluso si alterar las fotos, como eliminar las etiquetas de GPS o cambiar la orientación, sería un trabajo difícil cuando leemos. Los archivos Exif y ExifInterface son la respuesta a estos problemas.

¿Qué es exactamente Exif?

El formato de archivo de imagen intercambiable ( Exif ) es un acrónimo de formato de archivo de imagen intercambiable. Este es un estándar que especifica información detallada sobre una fotografía u otro medio grabado por una cámara. Puede guardar información crítica como la exposición de la cámara, la fecha/hora en que se tomó la imagen e incluso la posición del GPS. 

El siguiente es un ejemplo de un archivo Exif:

Enlace de fuente de ejemplo de datos EXIF: https://www.photographymad.com/files/images/exif-data.jpg

Si observa la imagen de arriba, notará que tiene atributos como el largo y el ancho de la imagen, la fecha y la hora de captura de la imagen, el dispositivo desde el que se capturó la imagen, el código de orientación y algunos de los atributos de la imagen, como la luz. , balance de blancos, distancia focal, si el flash estaba encendido o no, e información GPS de la imagen, es decir, la latitud larga de la imagen donde fue capturada. Podemos ver todas las características de la imagen con solo mirarla. Ahora debería tener una buena comprensión de los archivos EXIF.

¿Cómo obtener datos EXIF ​​en Android?

Aprendimos qué es Exif y qué incluye usando ExifInterface en Android. Echemos un vistazo a cómo podemos obtener datos Exif de imágenes en Android. Desde la versión 25.1.0, ExifInterface se ha incluido en la biblioteca de soporte de Android. Aunque la función existe desde Android 7.1, con todas las posibilidades ofrecidas a la interfaz de usuario, solo tenía sentido a partir de Android 9+. Esto se ha mejorado con más de 100 características para leer etiquetas Exif, que incluyen información sobre la cámara, la configuración de la cámara, la orientación y las coordenadas GPS.

Solo puede leer el Exif de archivos JPEG o un archivo de imagen RAW en este momento. JPEG, DNG, CR2, NEF, NRW, ARW, RW2, ORF, PEF, SRW, RAF y HEIF son todos formatos admitidos.

Debe agregar la siguiente dependencia a su build.gradle si desea utilizar ExifInterface.

 implementation 'androidx.exifinterface:exifinterface:1.3.2'

Una cosa para recordar acerca de los datos Exif es que no hay etiquetas obligatorias: cada etiqueta es opcional y algunos servicios incluso eliminan los datos Exif por completo. Como resultado, siempre debe abordar los casos en los que no hay datos Exif, ya sea porque no hay datos para una sola propiedad o porque el formato de la imagen no permite que los datos se vinculen en absoluto como el infame formato WebP.

¿Qué son los atributos Exif y cómo los leo?

Veamos cómo ExifInterface puede leer las características EXIF ​​de varias fuentes y algunos de los casos de uso. Simplemente usaría los métodos getAttributeInt(), getAttributeDouble() o getAttribute() (para strings) para la mayoría de los atributos.

Uri para extraer datos del contenido:

Kotlin

Uri gfgUri; // the file uri
InputStream gfgIn;
try {
    gfgIn = getContentResolver().openInputStream(gfgUri);
    ExifInterface exifInterface = new ExifInterface(gfgIn);
    // Extract the EXIF tag here
} catch (IOException e) {
    // Handle any errors
} finally {
    if (gfgIn != null) {
        try {
            gfgIn.close();
        } catch (IOException ignored) {}
    }
}

GeekTip: que los InputStreams externos, como los devueltos por HttpURLConnection, no funcionarán con ExifInterface. Se recomienda encarecidamente que solo se utilicen con contenido:/ o archivo:/ URI.

Para aplicaciones de cámara:

Las propiedades de escritura son más esenciales una vez que se ha capturado la imagen. Todavía está restringido a imágenes JPEG por el momento. Simplemente podemos cambiar la ORIENTACIÓN JPEG, la UBICACIÓN GPS JPEG o el equivalente usando ExifInterface. A petición del usuario, también podemos eliminar estas características.

Kotlin

var  gfgExif  : ExifInterface  = ExifInterface(pictureFile.getPath())
gfgExif.setAttribute(ExifInterface.TAG_ORIENTATION, "" + getPhotoOrientation(configurationProvider.getSensorPosition()))
gfgExif.saveAttributes()

La orientación de la imagen:

Que se mantiene en la apropiadamente llamada TAG ORIENTATION, que da como resultado una de las constantes ORIENTATION_, es una de las propiedades más esenciales a la hora de presentar imágenes. Puede procesar posteriormente el valor para convertirlo en un ángulo de rotación.

Java

int gfgRoatation = 0;
int gfgOrientation  = exifInterface.getAttributeInt(
ExifInterface.TAG_GFGORIENTATION ,
ExifInterface.GFGORIENTATION _UNDEFINED);
switch (gfgOrientation ) {
    case ExifInterface.GFGORIENTATION _ROTATE_90:
    gfgRoatation = 180;
    break;
    case ExifInterface.GFGORIENTATION _ROTATE_180:
    gfgRoatation = 0;
    break;
    case ExifInterface.GFGORIENTATION _ROTATE_270:
    gfgRoatation = 270;
    break;
}

Paso n.º 1: Cree primero la ExifInterface:

Java

ExifInterface gfgexif = new ExifInterface(uri.getPath());

Paso n.º 2: luego gire el mapa de bits usando el ángulo de rotación Exif:

Java

int gfgrotation = gfgexif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);

Paso #3: Para convertir la rotación Exif a grados, use la siguiente fórmula:

Java

int gfgDegRotation = exifToDegrees(gfgRotation);

Paso #4: Luego, usando una array, gire la imagen usando la rotación real de la imagen como punto de referencia:

Java

Matrix gfgMatrix = new Matrix();
if (gfgrotation != 0) {
    gfgMatrix.postRotate(rotationInDegrees);
}

Paso #5: La función Bitmap.createBitmap, que acepta Matrix como entrada, se usa para hacer la nueva imagen rotada:

Java

Bitmap.createBitmap(Bitmap source, int x, int y, int width)

¡Y listo, se crean los datos EXIF!

Algunos ejemplos de cómo se puede utilizar ExifInterface

  1. Cuando se toma una fotografía, se utiliza ExifInterface para escribir la información de la imagen. También es útil realizar un seguimiento de la orientación de la imagen al almacenarla en la memoria de su teléfono.
  2. Es posible que necesitemos reducir el tamaño de la imagen y actualizar la información Exif; en este caso, necesitaremos obtener la información Exif y guardar la nueva información en la imagen.
  3. Los encabezados de las imágenes también se recuperan y analizan mediante ExifInterface.
  4. Cuando se gira el dispositivo, la orientación visual permanece constante.
  5. Obtener una imagen de la galería y presentarla con la orientación adecuada y otros datos que se guardaron con la imagen.

Publicación traducida automáticamente

Artículo escrito por icloudanshu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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