EXIF (Exchangeable Image File Format) es el estándar para especificar los formatos de imagen y sonido que utilizan principalmente las cámaras digitales y los escáneres. Los datos EXIF incluyen la información de etiquetado y metadatos sobre el archivo de imagen capturado. Los metadatos pueden contener información como la marca de la cámara, el modelo, la velocidad de obturación, la fecha y la hora, la apertura, el tiempo de exposición, la resolución X, la resolución Y. etc.

Si desea administrar, extraer, actualizar o eliminar datos EXIF de sus imágenes mediante programación, entonces este artículo es para usted. Este artículo cubrirá las siguientes formas de manipular con datos EXIF en Java:

Biblioteca de manipulación de metadatos de Java

API Java de metadatos de GroupDocs

GroupDocs.Metadata para Java es una API Java de administración de metadatos fácil de usar. Tiene la capacidad no solo de extraer metadatos de imágenes como JPG, PNG o WebP, sino que también puede agregar, editar, actualizar y eliminar metadatos de las imágenes y otros documentos con diferentes opciones.

Estoy usando esta API en este artículo, así que asegúrese de descargar o integrarla en sus aplicaciones basadas en Maven simplemente agregando las siguientes configuraciones a pom.xml.

Repositorio y dependencia

<repository>
	<id>GroupDocsJavaAPI</id>
	<name>GroupDocs Java API</name>
	<url>http://repository.groupdocs.com/repo/</url>
</repository>
<dependency>
    <groupId>com.groupdocs</groupId>
    <artifactId>groupdocs-metadata</artifactId>
    <version>20.5</version>
    <classifier>javadoc</classifier>
</dependency>

Extraer datos EXIF de imágenes en Java - Visor de metadatos

Puede leer las propiedades de los datos EXIF siguiendo unos sencillos pasos. Comencemos con la extracción de datos EXIF de esta imagen de la Torre Eiffel. He seleccionado un archivo JPG como imagen de ejemplo, puede usar cualquiera de sus archivos, ya sea PNG, WebP, BMP, GIF o TIFF.

Imagen de la Torre Eiffel para datos EXIF
  • Cargue el archivo de origen de la imagen que contiene información de datos EXIF utilizando el constructor de clase Metadata.
  • Obtenga su paquete raíz llamando al método getRootPackage().
  • Desde el paquete raíz, obtenga su paquete EXIF llamando al método getExifPackage().
  • Una vez que tenga el paquete EXIF, puede obtener las propiedades EXIF de la imagen como Marca, Modelo, Ancho, Longitud, Fecha-Hora, etc., como se muestra en el siguiente ejemplo de código Java.
// Extract EXIF Data Package Information from image in Java
try (Metadata metadata = new Metadata("eiffel-tower.jpg")) {
	IExif root = (IExif) metadata.getRootPackage();
	if (root.getExifPackage() != null) {
		// Extract EXIF Package
		ExifPackage exifPackage = root.getExifPackage();
		System.out.println("Make : " + exifPackage.getMake());
		System.out.println("Model : " + exifPackage.getModel());
		System.out.println("Width : " + exifPackage.getImageWidth());
		System.out.println("Length : " + exifPackage.getImageLength());
		System.out.println("DateTime : " + exifPackage.getDateTime());					
	} 
}

Aquí está la información EXIF que obtendrá como resultado del código anterior.

Make : NIKON CORPORATION
Model : NIKON D3000
Width : 640
Length : 424
DateTime : 2014:08:09 10:35:13

Para obtener más información sobre el paquete IFD (Directorio de archivos de imágenes) y GPS (Sistema de posicionamiento global), solo tiene que llamar a los métodos respectivos del paquete EXIF, es decir, getExifIfdPackage() o getGpsPackage(). De estos paquetes, puede extraer más información como;

  • Dispositivo de captura de imágenes número de serie
  • Cámara Nombre del propietario
  • Comentarios del usuario
  • Altitud
  • Latitud
  • Longitud
  • etc.

Aquí está el código que puede agregar en su método anterior para mostrar datos EXIF junto con información IFD y GPS.

// EXIF IFD Package
ExifIfdPackage exifIfdPackage = exifPackage.getExifIfdPackage();
System.out.println("BodySerialNumber : " + exifIfdPackage.getBodySerialNumber());
System.out.println("CameraOwnerName : " + exifIfdPackage.getCameraOwnerName());
System.out.println("UserComment : " + exifIfdPackage.getUserComment());
// EXIF GPS Information Package
ExifGpsPackage exifGpsPackage = exifPackage.getGpsPackage();
System.out.println("getAltitude : " + exifGpsPackage.getAltitude());
System.out.println("Latitude Ref : " + exifGpsPackage.getLatitudeRef());
System.out.println("LongitudeRef : " + exifGpsPackage.getLongitudeRef());

Lea todas las etiquetas EXIF de imágenes usando Java

Si desea mostrar o extraer todas las propiedades EXIF de cualquier imagen o archivo, puede hacerlo en pasos similares a los ejemplos anteriores:

  • Simplemente cargue el archivo con el constructor Metadatos.
  • Obtenga el paquete raíz EXIF llamando al método getRootPackage().
  • Obtenga el paquete EXIF llamando al método getExifPackage().
  • Iterar a través del paquete EXIF para obtener los pares de nombre y valor deseados.
  • De igual forma, obtiene los paquetes IFD y GPS y visualiza sus claves y valores.
try (Metadata metadata = new Metadata("eiffel-tower.jpg")) {
	IExif root = (IExif) metadata.getRootPackage();
	if (root.getExifPackage() != null) {
		String pattern = "%s = %s";
		// Reading all EXIF tags.
		for (TiffTag tag : root.getExifPackage().toList()) {
			System.out.println(String.format(pattern, tag.getName(), tag.getValue()));
		}
		// Extract all EXIF IFD tags.
		for (TiffTag tag : root.getExifPackage().getExifIfdPackage().toList()) {
			System.out.println(String.format(pattern, tag.getName(), tag.getValue()));
		}
		// Extract all EXIF GPS tags
		for (TiffTag tag : root.getExifPackage().getGpsPackage().toList()) {
			System.out.println(String.format(pattern, tag.getName(), tag.getValue()));
		}
	}
}

Actualizar propiedades EXIF en Java

Incluso puede cambiar fácilmente los datos EXIF existentes de cualquier imagen o cualquier documento. Los pasos son simples:

Actualizar paquete EXIF

  • Obtenga el paquete EXIF llamando al método getExifPackage().
  • Utilice los métodos setter como;
  • Del mismo modo, puede establecer los valores de artista, marca, modelo, software, ancho y alto de la imagen, fecha, hora, etc.

Actualizar paquete EXIF IFD

Al igual que actualizar el paquete EXIF, puede actualizar las propiedades de los paquetes EXIF IFD y GPS. Visite la clase ExifIfdPackage o ExifGpsPackage para saber cuánto puede personalizar sus valiosas imágenes y documentos.

// Update/Set new values in EXIF Data (EXIF Package and EXIF IFD Package).
try (Metadata metadata = new Metadata("eiffel-tower.jpg")) {
    IExif root = (IExif) metadata.getRootPackage();
    // Set the EXIF package if it's missing
    if (root.getExifPackage() == null) {
        root.setExifPackage(new ExifPackage());
    }
    ExifPackage exifPackage = root.getExifPackage();
    // Setting the desired values in EXIF Package and EXIF IFD Package.
    exifPackage.setCopyright("Copyright (C) 2011-2020 GroupDocs. All Rights Reserved.");
    exifPackage.setImageDescription("Eiffel Tower for EXIF");
    exifPackage.setSoftware("GroupDocs.Metadata");
    exifPackage.getExifIfdPackage().setBodySerialNumber("GD-2020");
    exifPackage.getExifIfdPackage().setCameraOwnerName("GroupDocs");
    exifPackage.getExifIfdPackage().setUserComment("Nice image captured in 2014");
    metadata.save("eiffel-tower-updated.jpg");
}

Eliminar metadatos EXIF de imágenes en Java

Esto es muy simple si desea eliminar el paquete EXIF de cualquier archivo, simplemente establezca su paquete EXIF en nulo llamando a setExifPackage(null) del paquete raíz.

// Removing the EXIF data from an image.
try (Metadata metadata = new Metadata("eiffel-tower.jpg")) {
    IExif root = (IExif) metadata.getRootPackage();
    root.setExifPackage(null);
    metadata.save("eiffel-tower-no-exif.jpg");
}

Imágenes compatibles y otros formatos

Estos son los formatos de archivo admitidos actualmente por GroupDocs.Metadata. Siempre puede visitar la documentación para obtener información actualizada.

Ver más sobre GroupDocs.Metadatos

Hablemos más @ Foro de soporte gratuito.

Artículo relacionado