Извлечение данных IPTC / EXIF из файлов tif с использованием Java
-
13-09-2019 - |
Вопрос
Система, над которой я работаю, имеет функцию извлечения метаданных из файлов JPEG с помощью com.drew.metadata
посылка. http://www.drewnoakes.com/code/exif/ Однако это ограничено файлами JPEG, и теперь клиент спросил об извлечении IPTC из TIF и, возможно, других форматов изображений.
Кто-нибудь знает о похожих API для Drew Noakes one, которые могут извлекать IPTC из TIF?
В идеале это был бы чисто Java-подход, подобный com.drew.metadata
один.
Решение
Это старый вопрос.В настоящее время мой metadata-extractor
библиотека поддерживает файлы TIFF, а также JPEG, WebP, PSD, PNG, GIF, BMP, ICO, PCX и многие форматы camera raw.
Проект недавно перешел на GitHub:
https://github.com/drewnoakes/metadata-extractor
И доступен через Maven:
Другие советы
Недавно я потратил некоторое время на кодирование части манипулирования метаданными айкафе Библиотека изображений Java и позволяет вставлять и извлекать типы метаданных, такие как EXIF, IPTC, PHOTOSHOP, ICC_Profile, миниатюра и т.д.Некоторые функции лучше других, но все они относительно нормально работают.Существует общий интерфейс для чтения всех метаданных, показанный ниже:
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Iterator;
import com.icafe4j.image.meta.Metadata;
import com.icafe4j.image.meta.MetadataEntry;
import com.icafe4j.image.meta.MetadataType;
import com.icafe4j.image.meta.iptc.IPTC;
public class ExtractIPTC {
public static void main(String[] args) throws IOException {
Map<MetadataType, Metadata> metadataMap = Metadata.readMetadata(args[0]);
IPTC iptc = (IPTC)metadataMap.get(MetadataType.IPTC);
if(iptc != null) {
Iterator<MetadataEntry> iterator = iptc.iterator();
while(iterator.hasNext()) {
MetadataEntry item = iterator.next();
printMetadata(item, "", " ");
}
}
}
private void printMetadata(MetadataEntry entry, String indent, String increment) {
logger.info(indent + entry.getKey() (StringUtils.isNullOrEmpty(entry.getValue())? "" : ": " + entry.getValue()));
if(entry.isMetadataEntryGroup()) {
indent += increment;
Collection<MetadataEntry> entries = entry.getMetadataEntries();
for(MetadataEntry e : entries) {
printMetadata(e, indent, increment);
}
}
}
}
Если мы передадим изображение "iptc.tif" из каталога "images" проекта в качестве аргумента, мы получим следующую информацию:
Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 6
Dataset value: Bayern
Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 11
Dataset value: Deckelstein
Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 7
Dataset value: Germany
Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 10
Dataset value: Nittendorf
Приведенный выше код работает как для JPEG, так и для TIFF.Он автоматически определяет тип изображения и делегирует выполнение работы соответствующему коду.
ПРИМЕЧАНИЕ:в файле TIFF, содержащем данные IPTC, может быть более одного места.Один из них - тег RichTiffIPTC, другой скрыт внутри тега Photoshop.В настоящее время icafe хранит только одни данные IPTC.Если существуют оба тега Photoshop с данными IPTC и тег RichTiffIPTC, он сохранит данные RichTiffIPTC.В противном случае, какой бы тег ни существовал, он сохранит данные IPTC из этого тега.Нет никаких проблем с сохранением данных из обоих мест.Текущая реализация с использованием карты, сопоставляющей ключ типа метаданных с уникальными метаданными.Таким образом, он сохраняет только один уникальный экземпляр метаданных.
Обновить: айкафе теперь можно объединить данные IPTC как из RichTiffIPTC, так и из Photoshop IRB и удалить дубликаты.
Обновление 2: Базовый класс всех типов метаданных в ICAFE - Metadata теперь реализует интерфейс Iterable, поэтому пользователь теперь может выполнять итерации по коллекции MetadataEntry.Сам метаданный создается с использованием составного шаблона, поэтому метаданный может содержать коллекцию других метаданных.Каждый MetadataEntry содержит пару ключей и значений.Такой дизайн позволяет осуществлять обход записей метаданных по древовидной структуре.
Здесь есть хороший пример использования imageio
библиотека для доступа к IPTC здесь
http://www.barregren.se/blog/how-read-exif-and-iptc-java-image-i-o-api
К сожалению, вам все равно придется выполнять часть работы самостоятельно.
Если вы не можете найти чистую реализацию Java, вы могли бы рассмотреть возможность использования привязок Java к ImageMagick (ДЖмагик).Это позволило бы использовать множество различных возможных форматов вывода.