我正在尝试保存元数据,但它没有被保存,我也没有收到任何错误。 图像得到正确保存。 我正在使用 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/