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