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. Вы всегда можете посетить документацию для получения обновленной информации.

Тип документа Форматы файлов
Изображения BMP, GIF, JPG, JPEG, JPE, JP2, PNG, DJVU, DWG, DXF, WebP, TIFF, PSD, EMF, WMF
Аудио и видео MP3, WAV, AVI, MOV/QT, FLV, ASF, DICOM

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

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

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