繁体   English   中英

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

[英]Imageio Tiff problems at the moment to upgrade from version 3.3.2 to 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 文档,您会发现该参数确实是元数据(也许“全局”或“文档”元数据会是更好的名称,但就是这样)。 而 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 的字节顺序。 这是唯一的“全局”设置。 但是您可以通过在写入的流上设置字节顺序来更轻松地配置此设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM