【问题标题】:Modifying or adding new tags to a jpg (Metadata) with iim4j使用 iim4j 修改或添加新标签到 jpg(元数据)
【发布时间】:2015-08-25 00:31:37
【问题描述】:

我正在尝试使用 iim4j 库修改或添加新标签,但它的文档很差。我一直在互联网上搜索示例,到目前为止还没有找到任何东西。我只得到了图书馆提供的例子。有一个关于读取元数据的示例,我可以获得图像的标题、描述和标签(我关心的那些)。我知道库将这些信息作为 DataSet 和 DataSetInfo 进行管理,因此我尝试为我想要添加的信息创建这些对象的新实例,但到目前为止我没有任何结果。

这是读取 jpeg 文件的 IPTC 部分的代码:

    public static void dump(File file) throws Exception {

    System.out.println("IPTC segment for " + file);
    IIMFile iimFile = new IIMFile();

    IIMReader reader = new IIMReader(new JPEGIIMInputStream(new FileIIMInputStream(file)), new IIMDataSetInfoFactory());
    iimFile.readFrom(reader, 20);

    for (Iterator i = iimFile.getDataSets().iterator(); i.hasNext();) {
        DataSet ds = (DataSet) i.next();            
        Object value = ds.getValue();
        if (value instanceof byte[]) {
            value = "<bytes " + ((byte[]) value).length + ">";
        }
        DataSetInfo info = ds.getInfo();
        if (info instanceof DefaultDataSetInfo)
        {
            System.out.println("-----------");
            System.out.println("Number : " + info.getDataSetNumber());
            System.out.println("Name :" + info.getName());
            Serializer serializador=info.getSerializer();
            if(serializador instanceof StringSerializer)
                System.out.println("Serializer :" + serializador.toString());
            System.out.println("Repeat : " + info.isRepeatable());
            System.out.println("----------");
        }

        System.out.println(info.toString() + " " + info.getName() + ": " + value);

    }
    reader.close();
}

我可以获得我需要的所有信息,而且我知道我必须使用那种对象来在另一个文件上添加新信息。所以我尝试了这个来添加一个新标签:

    String tagToAdd="Tag to add";
    int size= tagToAdd.length();
    DefaultDataSetInfo valueTag=new DefaultDataSetInfo(537,"Keywords", new StringSerializer(size+ ""),true);
    DefaultDataSet dataSet=new DefaultDataSet(valueTag, tagToAdd.getBytes());
    iimFile.add(dataSet);

并尝试用这个写一个带有标签的新文件:

    String tagToAdd="Tag to add";
    int size= tagToAdd.length();
    DefaultDataSetInfo valueTag=new DefaultDataSetInfo(537,"Keywords", new StringSerializer(size+ ""),true);
    DefaultDataSet dataSet=new DefaultDataSet(valueTag, tagToAdd.getBytes());

    IIMWriter escritor= new IIMWriter(new DefaultIIMOutputStream(file));
    escritor.write(dataSet);
    escritor.close();

未添加标签。我需要一些关于这个库及其使用的帮助。谢谢

【问题讨论】:

  • 正如你所说,文档很差,这真的很遗憾,因为从我所看到的代码来看不是。事实上,在不得不与 commons-imaging 搏斗之后,iim4j 看起来很出色。另外,请参阅我的答案以获取解决问题的简单方法。

标签: java tags metadata jpeg keyword


【解决方案1】:

根据我自己的测试,IIMWriter 似乎仅用于将 IPTC 元数据写入文件,没有其他用途。不用说,这并不构成有效的 JPEG 文件。您想要的是获取一个现有的 JPEG 文件,并使用相同的数据生成一个新文件,除了应该删除的 IPTC 元数据(如果有)并替换为您的 IIMFile 的内容。

这正是JPEGUtil.insertIIMIntoJPEG 的用途。您需要做的是这样的(其中newFile 是一个File insatnce 指向您要保存修改后的JPEG 的位置):

// 1. Read original IIM
IIMReader reader = new IIMReader(new JPEGIIMInputStream(new FileIIMInputStream(file)), new IIMDataSetInfoFactory());
iimFile.readFrom(reader, 20);

// 2. Add dataset
DataSet dataSet = ... // Whatever you want
iimFile.add(dataSet);

// 3. Create new copy of JPEG file new IIM
try (
  InpuStream in = new BufferedInputStream(new FileInputStream(file));
  OutputStream out = new BufferedOutputStream(new FileOutputStream(newFile))
) {
  JPEGUtil.insertIIMIntoJPEG(out, iimFile, in)
}

【讨论】:

    猜你喜欢
    • 2011-12-02
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多