Извлечение данных IPTC / EXIF ​​из файлов TIF с использованием Java - PullRequest
2 голосов
/ 07 декабря 2009

В системе, над которой я работаю, есть функция извлечения метаданных из файлов JPEG с использованием пакета com.drew.metadata. http://www.drewnoakes.com/code/exif/ Однако это касается только файлов JPEG, и теперь клиент спросил об извлечении IPTC из TIF и, возможно, других форматов изображений.

Кто-нибудь знает о подобных API для Drew Noakes, которые могут извлекать IPTC из TIF?

В идеале это был бы подход на основе чистого Java, такой как com.drew.metadata.

Ответы [ 4 ]

3 голосов
/ 15 февраля 2015

Это старый вопрос. В настоящее время моя библиотека metadata-extractor поддерживает файлы TIFF, а также JPEG, WebP, PSD, PNG, GIF, BMP, ICO, PCX и многие форматы необработанных снимков.

Проект недавно перешел на GitHub:

https://github.com/drewnoakes/metadata-extractor

И доступен через Maven:

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

2 голосов
/ 06 февраля 2015

Недавно я провел некоторое время, кодируя часть манипулирования метаданными icafe библиотеки изображений 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 из этого тега. Нет проблем с хранением данных из обоих мест. Текущая реализация, использующая карту, отображающую ключ типа метаданных на уникальные метаданные. Таким образом, он содержит только один уникальный экземпляр метаданных.

Обновление: icafe теперь может объединять данные IPTC из RichTiffIPTC и Photoshop IRB и удалять дубликаты.

Update2: Базовый класс всех типов метаданных в ICAFE - Метаданные теперь реализуют интерфейс Iterable, так что теперь пользователь может выполнять итерацию по коллекции MetadataEntry. Сама MetadataEntry создается с использованием составного шаблона, поэтому MetadataEntry может содержать коллекцию других MetadataEntry. Каждый MetadataEntry содержит ключ и пару значений. Этот дизайн допускает обход структуры метаданных в древовидной структуре.

1 голос
/ 09 января 2010

Здесь есть хороший пример использования imageio lib для доступа к IPTC

http://www.barregren.se/blog/how-read-exif-and-iptc-java-image-i-o-api

К сожалению, вам все равно придется выполнять некоторые работы самостоятельно.

0 голосов
/ 09 января 2010

Если вы не можете найти чистую реализацию Java, вы можете рассмотреть возможность использования привязок Java к ImageMagick ( JMagick ). Это позволило бы получить множество различных форматов вывода.

...