Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java从tif文件中提取IPTC/EXIF数据_Java_Image Processing_Metadata_Iptc_Metadata Extractor - Fatal编程技术网

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

使用Java从tif文件中提取IPTC/EXIF数据,java,image-processing,metadata,iptc,metadata-extractor,Java,Image Processing,Metadata,Iptc,Metadata Extractor,我正在使用的系统有一个功能,可以使用com.drew.metadata包从JPEG文件中提取元数据。然而,这仅限于JPEG文件,现在一位客户询问如何从TIF和其他可能的图像格式中提取IPTC 有人知道类似于Drew Noakes one的API,可以从TIF中提取IPTC吗 理想情况下,这将是一种纯Java方法,如com.draw.metadataone。这里有一个使用imageio库访问IPTC的好例子 遗憾的是,您自己仍然需要处理一些工作。 < P>如果找不到纯java实现,可以考虑使用j

我正在使用的系统有一个功能,可以使用
com.drew.metadata
包从JPEG文件中提取元数据。然而,这仅限于JPEG文件,现在一位客户询问如何从TIF和其他可能的图像格式中提取IPTC

有人知道类似于Drew Noakes one的API,可以从TIF中提取IPTC吗


理想情况下,这将是一种纯Java方法,如
com.draw.metadata
one。

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


<>遗憾的是,您自己仍然需要处理一些工作。

< P>如果找不到纯java实现,可以考虑使用java绑定到IMAGE()。这将允许大量不同的输出格式。

我最近花了一些时间对Java image library的元数据操作部分进行编码,使其能够插入和提取元数据类型,如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);
             }          
        }
    }   
}
以上代码同样适用于JPEG和TIFF。它会自动检测图像类型,并委托相应的代码来完成工作

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

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


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

这是一个老问题。现在,我的
元数据提取器
库支持TIFF文件,以及JPEG、WebP、PSD、PNG、GIF、BMP、ICO、PCX和许多相机原始格式

该项目最近转移到GitHub:

可通过Maven获得:

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