我的问题是我正在尝试将大量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;
}
答案 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段限制。