EXIF (Exchangeable Image File Format) é o padrão para especificar os formatos de imagem e som usados principalmente por câmeras digitais e scanners. Os dados EXIF incluem as informações de marcação e metadados sobre o arquivo de imagem capturado. Os metadados podem conter informações como marca da câmera, modelo, velocidade do obturador, data e hora, abertura, tempo de exposição, resolução X, resolução Y. etc.

Se você deseja gerenciar, extrair, atualizar ou remover dados EXIF de suas imagens de forma programática, este artigo é para você. Este artigo abordará as seguintes maneiras de manipular com dados EXIF em Java:

Biblioteca de Manipulação de Metadados Java

API Java de metadados por GroupDocs

GroupDocs.Metadata for Java é uma API Java de gerenciamento de metadados fácil de usar. Ele tem a capacidade de não apenas extrair metadados de imagens como JPG, PNG ou WebP, mas também adicionar, editar, atualizar e remover metadados das imagens e outros documentos com diferentes opções.

Estou usando esta API neste artigo, portanto, certifique-se de baixar ou integrá-la em seus aplicativos baseados em Maven apenas adicionando as seguintes configurações ao pom.xml.

Repositório e dependência

<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>

Extrair dados EXIF de imagens em Java - Visualizador de metadados

Você pode ler as propriedades de dados EXIF seguindo etapas simples. Vamos começar com a extração dos dados EXIF desta foto da Torre Eiffel. Selecionei um arquivo JPG como imagem de exemplo, você pode usar qualquer um dos seus arquivos, seja PNG, WebP, BMP, GIF ou TIFF.

Imagem da Torre Eiffel para dados EXIF
  • Carregue o arquivo de origem da imagem contendo informações de dados EXIF usando o construtor de classe Metadata.
  • Obtenha seu pacote raiz chamando o método getRootPackage().
  • Do pacote raiz, obtenha seu pacote EXIF chamando o método getExifPackage().
  • Depois de ter o pacote EXIF, você pode obter as propriedades EXIF da imagem, como Make, Model, Width, Length, Date-Time, etc., conforme mostrado no exemplo de código Java abaixo.
// 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());					
	} 
}

Aqui estão as informações EXIF que você obterá como resultado do código acima.

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

Para obter mais informações do pacote IFD (Diretório de Arquivos de Imagem) e GPS (Sistema de Posicionamento Global), basta chamar os respectivos métodos do pacote EXIF, ou seja, getExifIfdPackage() ou getGpsPackage(). Desses pacotes, você pode extrair mais informações como;

  • Dispositivo de captura de imagem número de série
  • Câmera Nome do proprietário
  • Comentários do usuário
  • Altitude
  • Latitude
  • Longitude
  • etc

Aqui está o código que você pode adicionar em seu método acima para exibir dados EXIF junto com informações IFD e 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());

Leia todas as tags EXIF de imagens usando Java

Se você deseja mostrar ou extrair todas as propriedades EXIF de qualquer imagem ou arquivo, pode fazê-lo em etapas semelhantes aos exemplos acima:

  • Basta carregar o arquivo com o construtor Metadados.
  • Obtenha o pacote raiz EXIF chamando o método getRootPackage().
  • Obtenha o pacote EXIF chamando o método getExifPackage().
  • Itere através do pacote EXIF para obter os pares nome-valor desejados.
  • Da mesma forma, obtenha os pacotes IFD e GPS e exiba suas chaves e 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()));
		}
	}
}

Atualizar propriedades EXIF em Java

Você pode até alterar os dados EXIF existentes de qualquer imagem ou documento facilmente. Os passos são simples:

Atualizar pacote EXIF

  • Obtenha o pacote EXIF chamando o método getExifPackage().
  • Use os métodos setter como;
  • Da mesma forma, você pode definir os valores para Artista, Marca, Modelo, Software, Largura e Altura da Imagem, Data, Hora, etc.

Atualizar pacote EXIF IFD

Assim como atualizar o pacote EXIF, você pode atualizar as propriedades dos pacotes EXIF IFD e GPS. Visite a classe ExifIfdPackage ou ExifGpsPackage para saber o quanto você pode personalizar para suas imagens e documentos valiosos.

// 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");
}

Remover metadados EXIF de imagens em Java

Isso é muito simples se você quiser remover o pacote EXIF de qualquer arquivo, basta definir seu pacote EXIF como nulo chamando setExifPackage(null) do pacote raiz.

// 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");
}

Imagens compatíveis e outros formatos

Aqui estão os formatos de arquivo atualmente suportados pelo GroupDocs.Metadata. Você sempre pode visitar a documentação para obter informações atualizadas.

Tipo de documento Formatos de arquivo
Imagens BMP, GIF, JPG, JPEG, JPE, JP2, PNG, DJVU, DWG, DXF, WebP, TIFF, PSD, EMF, WMF
Áudio e Vídeo MP3, WAV, AVI, MOV/QT, FLV, ASF, DICOM

Veja mais sobre GroupDocs.Metadata

Vamos conversar mais @ Fórum de suporte gratuito.

Artigo relacionado