Извлечение данных IPTC / EXIF из файлов tif с использованием Java

StackOverflow https://stackoverflow.com/questions/1861202

Вопрос

Система, над которой я работаю, имеет функцию извлечения метаданных из файлов 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:

http://search.maven.org/#search%7Cga%7C1%7Cdrewnoakes

Другие советы

Недавно я потратил некоторое время на кодирование части манипулирования метаданными айкафе Библиотека изображений 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 (ДЖмагик).Это позволило бы использовать множество различных возможных форматов вывода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top