【发布时间】: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将其移动到文件顶部,它也不会显示数据