使用多个数据包将大量XMP数据插入jpg?

时间:2014-12-09 15:52:24

标签: java jpeg rdf xmp

我的问题是我正在尝试将大量RDF数据插入到jpeg图像中,特别是插入到XMP标头中。 RDF特定于我的应用程序,具有自定义命名空间等。但是这不应该影响插入RDF的过程。 我可以使用少量的RDF数据执行此操作,但是当我尝试插入更大的内容时,我达到了XMP数据包大小限制。

我正在使用Java和Apache Sanselan lib,但是我可以使用其他库。

下面是我在测试应用程序中使用的代码,但我不知道如何将其拆分为多个XMP数据包,以便我插入所需的所有数据。

非常感谢任何正确方向的帮助或指示:)

由于

private static File writeXmpToFile(File file, String xmpXmlAsString)
                throws FileNotFoundException, ImageReadException, IOException,
                ImageWriteException {

        String XmpXmlAsString = xmpXmlAsString;

        File fileWithXmpXml = new File(file.getParent(), file.getName()+ ".added-xmp" + ".jpg");
        OutputStream os = null;
        try {
                os = new BufferedOutputStream(new FileOutputStream(fileWithXmpXml));
                new JpegXmpRewriter().updateXmpXml(new ByteSourceFile(file), os, XmpXmlAsString);
        } finally {
                if (os != null) {
                        os.close();
                }
                os = null;
        }
        return fileWithXmpXml;
}

1 个答案:

答案 0 :(得分:1)

引用Adobe XMP规范第3部分:

  

遵循JPEG部分的常规规则,标题加上以下数据最多可以为65535个字节   长。如果XMP数据包未跨多个APP1部分分割,则XMP数据包的大小最多   65502字节。 XMP超过这个尺寸是不寻常的;通常,它大约是2 KB。

     

如果序列化XMP数据包大于64 KB限制,则可以将其划分为主要部分   (StandardXMP)和扩展部分(ExtendedXMP),并将其存储在多个JPEG标记段中。一个   读者必须检查是否存在ExtendedXMP,如果存在,则将数据与主XMP集成。   每个部分(标准和扩展)都是完全形成的XMP元数据树,尽管只是标准部分   包含一个完整的数据包包装器。如果数据超过64 KB限制的两倍,则扩展部分可以   也可以拆分并存储在多个标记段中;在这种情况下,分裂部分没有完全形成   元数据树。

     

当需要ExtendedXMP时,必须根据分配更多的算法拆分元数据   主要部分的重要数据,以及扩展部分或部分的重要数据。

目前大多数元数据管理代码只处理 标准的XMP部分,适合单个APP1部分 - 或者 阅读或写作。 Exiftool似乎可以使用ExtendedXMP。

对于ExtendedXMP结构及其如何包含在JPEG多个中 细分,我回答了一个问题here

基本上,您需要将整个XMP数据分成两部分:a 标准XMP将适合带有数据包的一个APP1段 包装器和一个ExtendedXMP,它也是一个结构良好的XMP但没有 包裹器。 ExtendedXMP部分可以是任何大小,如果它 超过单个APP1的限制,它将被拆分并插入 多个APP1段。

以上链接代码也可以插入大号 XMP数据,只要您将其分成两部分并保持标准 XMP部分小于一个APP1段限制。