我正在使用的系统具有使用com.drew.metadata
包从 JPEG 文件中提取元数据的功能。http://www.drewnoakes.com/code/exif/但是,这仅限于 JPEG 文件,现在客户询问如何从 TIF 以及可能的其他图像格式中提取 IPTC。
有谁知道与 Drew Noakes 类似的 API,可以从 TIF 中提取 IPTC?
理想情况下,这将是一种类似的纯 Java 方法com.drew.metadata
。
我正在使用的系统具有使用com.drew.metadata
包从 JPEG 文件中提取元数据的功能。http://www.drewnoakes.com/code/exif/但是,这仅限于 JPEG 文件,现在客户询问如何从 TIF 以及可能的其他图像格式中提取 IPTC。
有谁知道与 Drew Noakes 类似的 API,可以从 TIF 中提取 IPTC?
理想情况下,这将是一种类似的纯 Java 方法com.drew.metadata
。
这是一个老问题。现在我的metadata-extractor
库支持 TIFF 文件,以及 JPEG、WebP、PSD、PNG、GIF、BMP、ICO、PCX 和许多相机原始格式。
该项目最近移至 GitHub:
https://github.com/drewnoakes/metadata-extractor
并且可以通过 Maven 获得:
我最近花了一些时间编写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。它会自动检测图像类型并委托给相应的代码来完成工作。
注意:包含 IPTC 数据的 TIFF 文件中可能有多个位置。一个是 RichTiffIPTC 标签,另一个是埋在 Photoshop 标签内。目前,icafe 只保留一份 IPTC 数据。如果带有 IPTC 数据的 Photoshop 标签和 RichTiffIPTC 标签都存在,它将保留 RichTiffIPTC 数据。否则,无论存在哪个标签,它都会保留来自该标签的 IPTC 数据。保存来自这两个地方的数据没有问题。当前使用映射将元数据类型键映射到唯一元数据的实现。所以它只保留一个唯一的元数据实例。
更新: icafe现在可以合并来自 RichTiffIPTC 和 Photoshop IRB 的 IPTC 数据并删除重复项。
Update2: ICAFE 中所有元数据类型的基类——元数据现在实现了 Iterable 接口,因此用户现在可以遍历 MetadataEntry 的集合。MetadataEntry 本身是使用复合模式创建的,因此 MetadataEntry 可以包含其他 MetadataEntry 的集合。每个 MetadataEntry 包含一个键和一个值对。这种设计允许元数据条目的树结构遍历。
这里有一个使用imageio
lib 访问 IPTC的好例子
http://www.barregren.se/blog/how-read-exif-and-iptc-java-image-io-api
不幸的是,您仍然必须自己处理一些工作。
如果找不到纯 Java 实现,可以考虑使用 Java 绑定到 ImageMagick ( JMagick )。这将允许大量不同的可能输出格式。