2

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

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

理想情况下,这将是一种类似的纯 Java 方法com.drew.metadata

4

4 回答 4

4

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

于 2015-02-15T00:57:20.960 回答
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。它会自动检测图像类型并委托给相应的代码来完成工作。

注意:包含 IPTC 数据的 TIFF 文件中可能有多个位置。一个是 RichTiffIPTC 标签,另一个是埋在 Photoshop 标签内。目前,icafe 只保留一份 IPTC 数据。如果带有 IPTC 数据的 Photoshop 标签和 RichTiffIPTC 标签都存在,它将保留 RichTiffIPTC 数据。否则,无论存在哪个标签,它都会保留来自该标签的 IPTC 数据。保存来自这两个地方的数据没有问题。当前使用映射将元数据类型键映射到唯一元数据的实现。所以它只保留一个唯一的元数据实例。

更新: icafe现在可以合并来自 RichTiffIPTC 和 Photoshop IRB 的 IPTC 数据并删除重复项。

Update2: ICAFE 中所有元数据类型的基类——元数据现在实现了 Iterable 接口,因此用户现在可以遍历 MetadataEntry 的集合。MetadataEntry 本身是使用复合模式创建的,因此 MetadataEntry 可以包含其他 MetadataEntry 的集合。每个 MetadataEntry 包含一个键和一个值对。这种设计允许元数据条目的树结构遍历。

于 2015-02-06T19:10:23.450 回答
1

这里有一个使用imageiolib 访问 IPTC的好例子

http://www.barregren.se/blog/how-read-exif-and-iptc-java-image-io-api

不幸的是,您仍然必须自己处理一些工作。

于 2010-01-09T17:42:41.180 回答
0

如果找不到纯 Java 实现,可以考虑使用 Java 绑定到 ImageMagick ( JMagick )。这将允许大量不同的可能输出格式。

于 2010-01-09T18:25:39.533 回答