Imageio Tiff问题目前要从3.3.2版本升级到3.8.2



我正在使用3.3.2版本的库,一切顺利,但对于漏洞主题,我决定升级到3.8.2版本,但现在,我收到了这个问题:

Unsupported stream metadata format, expected com_sun_media_imageio_plugins_tiff_stream_1.0: [com_sun_media_imageio_plugins_tiff_image_1.0, javax_imageio_1.0]

看起来像新的对象到元数据是TIFFStreamMetadada而不是TIFFImageMetadata,但我不知道如何从以前的版本更改,没有更新或如何避免异常。有人能支持我吗?

这是我的代码。

IIOMetadata metadata = getTifMetadata(); writer.prepareWriteSequence(metadata);
private IIOMetadata getTifMetadata() throws IIOInvalidTreeException {
String now = LocalDateTime.now(ZoneId.of("CST", ZoneId.SHORT_IDS)).format(dateTimeFormatter);
// custom tiff attributes
List<Entry> ifd = new ArrayList<>();
ifd.add(new TiffAttribute(TIFF.TAG_X_RESOLUTION, new Rational(RESOLUTION_PERCENT),
TIFF_RATIONAL_TYPE));
ifd.add(new TiffAttribute(TIFF.TAG_Y_RESOLUTION, new Rational(RESOLUTION_PERCENT),
TIFF_RATIONAL_TYPE));
ifd.add(new TiffAttribute(TIFF.TAG_RESOLUTION_UNIT, RESOLUTION_UNIT_DPI, TIFF_NUMBER_TYPE));
ifd.add(new TiffAttribute(TIFF.TAG_SOFTWARE, TIFF_SOFTWARE_NAME, TIFF_STRING_TYPE));
ifd.add(new TiffAttribute(TIFF.TAG_DATE_TIME, now, TIFF_STRING_TYPE));
ifd.add(new TiffAttribute(TIFF.TAG_MODEL, TIFF_MODEL, TIFF_STRING_TYPE));
String standardFormat = IIOMetadataFormatImpl.standardMetadataFormatName;
IIOMetadata metadata = new TIFFImageMetadata(ifd);
IIOMetadataNode customMeta = new IIOMetadataNode(standardFormat);
IIOMetadataNode dimension = new IIOMetadataNode("Dimension");
customMeta.appendChild(dimension);
IIOMetadataNode xSize = new IIOMetadataNode("HorizontalPixelSize");
dimension.appendChild(xSize);
xSize.setAttribute("value", String.valueOf(TIF_DPI));
IIOMetadataNode ySize = new IIOMetadataNode("VerticalPixelSize");
dimension.appendChild(ySize);
ySize.setAttribute("value", String.valueOf(TIF_DPI));
metadata.mergeTree(standardFormat, customMeta);
return metadata;
}

有什么建议吗?请。

如果您查看prepareWriteSequence的API文档,您会发现该参数确实是元数据(可能是"global")或";document"元数据可能是更好的名称,但它就是元数据)。而TIFF格式只有与每个图像或IFD相关联的元数据[1]。这意味着您所做的工作在早期版本中也不能按预期工作,它只是被静默地忽略了。

修复很容易,只需传递null作为流元数据:

writer.prepareWriteSequence(null);

要正确地编写TIFF元数据,需要将它与图像(和可选的缩略图)一起作为IIOImage传递给writeToSequence方法:

writer.writeToSequence(new IIOImage(image, null, metadata), param);

最后:

writer.endWriteSequence();

或者,如果您只需要将单个图像写入TIFF,则可以跳过所有的"序列"。方法,并简单地使用(同样,将null作为流元数据传递):

writer.write(null, new IIOImage(image, null, metadata), param);

1:为了与JAI TIFF插件兼容,流元数据也可以在TwelveMonkeys TIFF插件中用于指定TIFF的字节顺序。这是唯一的"全球"。设置。但是您可以通过在写入的流上设置字节顺序来更容易地配置此设置。

最新更新