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 зображення, як Make, Model, Width, Length, Date-Time тощо, як показано в наведеному нижче прикладі коду 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().
  • Використовуйте такі методи налаштування, як;
  • Так само ви можете встановити значення для виконавця, марки, моделі, програмного забезпечення, ширини та висоти зображення, дати, часу тощо.

Оновіть пакет 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

Давайте поговоримо більше @ Безкоштовний форум підтримки.

Пов’язана стаття