java - PNGj,元数据不被保存

标签 java png metadata

我正在尝试保存元数据,但它没有被保存,我也没有收到任何错误。 图像得到正确保存。 我正在使用 PNGJ 库。

读取元数据(和图像)工作正常,我正在使用 imagemagick 检查。

代码是:

ImageInfo imi = new ImageInfo(size.x, size.y, 8, true);
PngWriter pngW = new PngWriter(outputStream, imi);
pngW.setCompLevel(compressionLevel);
pngW.getMetadata().setText(PngChunkTextVar.KEY_Title, "My image");

ImageLineInt iline = new ImageLineInt(imi);

for (int row = 0, c = 0; row < pngW.imgInfo.rows; row++) {
    for (int col = 0; col < imi.cols; col++) {
        int r = image[c++] & 0xFF, g = image[c++] & 0xFF, b = image[c++] & 0xFF, a = image[c++] & 0xFF;
        ImageLineHelper.setPixelRGBA8(iline, col, r, g, b, a);
    }

    pngW.writeRow(iline);
}
pngW.end();

为什么没有保存元数据,或者为什么我没有收到错误消息?

最佳答案

在 PNG 格式中,文本 block 对其在 block 序列中的位置没有限制:它们可以放在 IDAT block (像素数据)之后。这是因为假定不需要(或影响)图像显示的文本元数据。

PNGJ 的 PngWriter library 将元数据 block 放入队列中,(默认情况下)尽可能晚地写入(合法/可能)。实际上,这意味着文本 block 将在 IDAT block 之后写入。如果你不想要这个,你应该首先问问自己是否真的想把图像信息(你需要显示图像)放在文本 block 中,这听起来很糟糕。无论如何,如果你想强制尽可能早地写入文本 block ,只需将优先级设置为 true:PngChunk.setPriority()

关于java - PNGj,元数据不被保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24871638/

相关文章:

c# - 如何在 SharePoint 中获取文件的元数据

javascript - SAPUI5 元数据.xml : binding two entities

java - 将链式方法与 Graphics2D 一起使用

java - 从字符串中获取原始数字类型的类

javascript - 在 Nashorn 中启用乐观类型的嵌套对象中出现奇怪的行为(属性设置为零)

javascript - 如何检测不呈现 .png 透明度的浏览器

java - 使用基类引用的派生类对象重载方法 - java

c - 读取缓冲区中的 png 图像

pdf - 使用 Ghostscript 将 PDF 的第一页转换为图像时,有时会得到 "extra"空间。为什么?

php 获取图像属性 "title"