提取TIF文件IPTC / EXIF数据中使用Java
-
13-09-2019 - |
题
我正在该系统具有这样的特征,以从使用com.drew.metadata
包JPEG文件中提取元数据。 http://www.drewnoakes.com/code/exif/ 然而,其不限于JPEG文件,现在客户已经被问及TIF提取IPTC,可能还有其他的图像格式。
没有人知道有关类似API来德鲁诺克斯一个,可以从提取TIF IPTC?
理想地,这将是象com.drew.metadata
一个纯Java的方法。
解决方案
这是一个老问题。如今我metadata-extractor
库支持TIFF文件,以及JPEG,WebP的,PSD,PNG,GIF,BMP,ICO,PCX,许多相机的RAW格式。
最近搬到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);
}
}
}
}
如果我们从“图像”通过图像“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数据和RichTiffIPTC标签在Photoshop标签存在,它会保持RichTiffIPTC数据。否则,无论标签存在,它将从标签保持IPTC数据。这是没有问题,从两个地方保存数据。当前实现使用地图映射元数据类型键,独特的元数据。因此,只有保持一个独特的元数据实例。
<强>更新强> iCafe咖啡厅现在可以从两个RichTiffIPTC结合IPTC数据和Photoshop的IRB和删除重复。
<强> UPDATE2:强>基类中的iCafe咖啡厅所有元数据类型 - 元数据现在实现可迭代接口,使用户现在可以通过MetadataEntry的集合迭代。 MetadataEntry本身是使用复合图案,从而一MetadataEntry可以包含其他MetadataEntry的集合创建。每个MetadataEntry包含密钥和值对。这种设计允许在元数据条目的树结构的遍历。
有这里使用imageio
LIB这里访问IPTC的是一个很好的例子
的http:// WWW .barregren.se /博客/如何读取-EXIF和 - IPTC-java的图像-IO-API
不幸的是,你仍然必须处理一些工作你自己的。
如果你不能找到一个纯Java实现,你可以考虑使用Java绑定的ImageMagick( JMagick )。这将允许对不同的可能的输出格式过多。