PNGj,元数据不会被保存

时间:2014-07-21 17:59:20

标签: 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();

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

1 个答案:

答案 0 :(得分:1)

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

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