簡體   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