EXIF (Exchangeable Image File Format) — это стандарт для указания форматов изображения и звука, которые в основном используются цифровыми камерами и сканерами. Данные EXIF включают информацию о тегах и метаданных о захваченном файле изображения. Метаданные могут содержать такую информацию, как производитель камеры, модель, выдержка, дата и время, диафрагма, время экспозиции, разрешение X, разрешение Y. и т.п.

Если вы хотите программно управлять, извлекать, обновлять или удалять данные EXIF ваших изображений, эта статья для вас. В этой статье будут рассмотрены следующие способы работы с данными EXIF в Java:

Библиотека управления метаданными Java

Java API метаданных от GroupDocs

GroupDocs.Metadata for Java — это простой в использовании Java API для управления метаданными. Он может не только извлекать метаданные из изображений, таких как JPG, PNG или WebP, но также может добавлять, редактировать, обновлять и удалять метаданные из изображений и других документов с различными параметрами.

Я использую этот API в этой статье, поэтому обязательно скачайте или интегрируйте его в свои приложения на основе Maven, просто добавив следующие конфигурации в файл pom.xml.

Репозиторий и зависимость

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

Извлечение данных EXIF из изображений в Java — средство просмотра метаданных

Вы можете прочитать свойства данных EXIF, выполнив простые шаги. Начнем с извлечения данных EXIF из этого изображения Эйфелевой башни. Я выбрал файл JPG в качестве примера изображения, вы можете использовать любой из ваших файлов, будь то PNG, WebP, BMP, GIF или TIFF.

Изображение Эйфелевой башни для данных EXIF
  • Загрузите исходный файл изображения, содержащий данные EXIF, с помощью конструктора класса Metadata.
  • Получите его корневой пакет, вызвав метод getRootPackage().
  • Из корневого пакета получите его EXIF-пакет, вызвав метод getExifPackage().
  • Если у вас есть пакет EXIF, вы можете получить свойства EXIF изображения, такие как Изготовление, Модель, Ширина, Длина, Дата-время и т. д., как показано на рисунке. в приведенном ниже примере кода 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());					
	} 
}

Вот информация EXIF, которую вы получите в результате выполнения приведенного выше кода.

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

Для получения дополнительной информации о пакетах IFD (каталог файлов изображений) и GPS (система глобального позиционирования) вам просто нужно вызвать соответствующие методы пакета EXIF, например getExifIfdPackage(). или getGpsPackage(). Из этих пакетов вы можете извлечь больше информации, например;

  • Устройство захвата изображения серийный номер
  • Камера Имя владельца
  • Комментарии пользователей
  • Высота
  • Широта
  • Долгота
  • так далее.

Вот код, который вы можете добавить в указанный выше метод для отображения данных EXIF вместе с информацией IFD и 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());

Чтение всех тегов EXIF изображений с использованием Java

Если вы хотите показать или извлечь все свойства EXIF любого изображения или файла, вы можете сделать это, выполнив шаги, аналогичные приведенным выше примерам:

  • Просто загрузите файл с помощью конструктора Metadata.
  • Получите корневой пакет EXIF, вызвав метод getRootPackage().
  • Получите пакет EXIF, вызвав метод getExifPackage().
  • Переберите пакет EXIF, чтобы получить нужные пары имя-значение.
  • Точно так же получите пакеты IFD и GPS и отобразите их ключи и значения.
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()));
		}
	}
}

Обновить свойства EXIF в Java

Вы даже можете легко изменить существующие данные EXIF любого изображения или любого документа. Шаги просты:

Обновить пакет EXIF

  • Получите пакет EXIF, вызвав метод getExifPackage().
  • Используйте такие методы установки, как;
    • setCopyright() - установить обновленную информацию об авторских правах.
    • setImageDescription() - установить описание изображения.
  • Точно так же вы можете установить значения для исполнителя, производителя, модели, программного обеспечения, ширины и высоты изображения, даты, времени и т. д.

Обновление пакета EXIF IFD

Точно так же, как при обновлении пакета EXIF, вы можете обновлять свойства пакетов EXIF IFD и GPS. Посетите класс ExifIfdPackage или ExifGpsPackage, чтобы узнать, сколько вы можете настроить для ценных изображений и документов.

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

Удалить метаданные EXIF из изображений в Java

Это очень просто, если вы хотите удалить пакет EXIF из любого файла, просто установите для его пакета EXIF значение null, вызвав setExifPackage(null) корневого пакета.

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

Поддерживаемые изображения и другие форматы

Вот поддерживаемые в настоящее время форматы файлов GroupDocs.Metadata. Вы всегда можете посетить документацию для получения обновленной информации.

Подробнее о GroupDocs.Metadata

Давайте поговорим подробнее @ Бесплатный форум поддержки.

Связанная статья