【问题标题】:PNGj, metadata doesn't get savedPNGj,元数据未保存
【发布时间】:2014-09-12 08:16:02
【问题描述】:

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

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

【问题讨论】:

  • 它对我有用。您确定未写入元数据吗?请记住(除非另有说明)块尽可能晚地写入(在这种情况下:文本块将在 IDAT 块之后写入。您可以通过entropymine.com/jason/tweakpng 进行检查
  • 谢谢,我现在没有!这实际上是我程序中的问题。让我感到震惊的是,imagemagick 不会显示我用 PNGJ 编写的块,但它会显示用 GIMP 或 TweakPNG 编写的块。有没有办法提前读取元数据?我应该打开(并关闭)另一个 PNGreader 吗?
  • "imagemagick 不会显示我用 PNGJ 编写的块" 为什么?因为他们在寻找IDAT?那将是一个错误。你可以验证一下,TweakPNG 可以让你移动一个块。 “有没有办法提前读取元数据?”我不明白这是什么意思。
  • 我想在像素之前读取元数据,因为它可以包含我的软件应该如何使用数据的重要信息。但据我了解,我必须调用 pngReader.end() 来读取数据之后的块,所以如果输入是一个不能倒带的 inputStream,那么我必须有两个,或者将数据缓冲到一个数组,这是次优的。就Imagemagick而言,即使我使用tweakpng将其移动到文件顶部,它也不会显示数据

标签: java png metadata


【解决方案1】:

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

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

【讨论】:

  • 感谢您的帮助!我打算在哪里使用 png 而不是专有格式来存储我需要的图像的所有数据,并使其易于使用其他软件打开。
猜你喜欢
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 2023-01-15
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多