我正在使用的系统具有使用com.drew.metadata
包从JPEG文件中提取元数据的功能。 http://www.drewnoakes.com/code/exif/但是仅限于JPEG文件,现在客户已经询问过如何从TIF中提取IPTC,以及可能还有其他图像格式。
有没有人知道类似的Drew Noakes API,可以从TIF中提取IPTC?
理想情况下,这将是纯粹的Java方法,如com.drew.metadata
。
答案 0 :(得分:3)
这是一个老问题。现在我的metadata-extractor
库支持TIFF文件,以及JPEG,WebP,PSD,PNG,GIF,BMP,ICO,PCX和许多相机原始格式。
该项目最近搬到了GitHub:
https://github.com/drewnoakes/metadata-extractor
可以通过Maven获得:
答案 1 :(得分:2)
我最近花了一些时间编写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);
}
}
}
}
如果我们从项目的“images”目录传递图像“iptc.tif”作为参数,我们将获得以下信息:
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数据。如果存在具有IPTC数据的Photoshop标记和RichTiffIPTC标记,则它将保留RichTiffIPTC数据。否则,无论哪个标记存在,它都会保留该标记的IPTC数据。从两个地方保存数据都没有问题。使用映射将元数据类型键映射到唯一元数据的当前实现。因此它只保留一个唯一的元数据实例。
更新: icafe现在可以合并来自RichTiffIPTC和Photoshop IRB的IPTC数据并删除重复数据。
Update2: ICAFE中所有元数据类型的基类 - 元数据现在实现了Iterable接口,因此用户现在可以遍历MetadataEntry集合。 MetadataEntry本身是使用复合模式创建的,因此MetadataEntry可以包含其他MetadataEntry的集合。每个MetadataEntry都包含一个键和一个值对。此设计允许遍历元数据条目的树结构。
答案 2 :(得分:1)
这里有一个使用imageio
lib来访问IPTC的好例子
http://www.barregren.se/blog/how-read-exif-and-iptc-java-image-i-o-api
不幸的是,你仍然需要自己处理一些工作。
答案 3 :(得分:0)
如果找不到纯Java实现,可以考虑使用Java绑定到ImageMagick(JMagick)。这将允许多种不同的可能输出格式。