[英]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.