使用Java从tif文件中提取IPTC / EXIF数据

时间:2009-12-07 16:42:11

标签: java image-processing metadata iptc metadata-extractor

我正在使用的系统具有使用com.drew.metadata包从JPEG文件中提取元数据的功能。 http://www.drewnoakes.com/code/exif/但是仅限于JPEG文件,现在客户已经询问过如何从TIF中提取IPTC,以及可能还有其他图像格式。

有没有人知道类似的Drew Noakes API,可以从TIF中提取IPTC?

理想情况下,这将是纯粹的Java方法,如com.drew.metadata

4 个答案:

答案 0 :(得分:3)

这是一个老问题。现在我的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

答案 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)。这将允许多种不同的可能输出格式。