如何使用ImageIO获取有关文件压缩的​​信息?

时间:2017-06-28 06:27:36

标签: java image-processing compression tiff

我有一个TIFF文件,我想知道它使用了哪种压缩 - 有没有办法使用ImageIO实现它?我试图从IIOMetadata对象获取此信息失败了。我最初从这个文件创建一个BufferedImage,处理它,然后尝试使用与原始文件相同的压缩保存它,但名称不同。

1 个答案:

答案 0 :(得分:1)

使用ImageIO API,以下代码将为您提供压缩(以人类可读的方式):

ImageReader reader = ...;

IIOMetadata metadata = reader.getImageMetadata(0); // 0, first image
IIOMetadataNode root = (IIOMetadataNode) metadata.getAsTree(IIOMetadataFormatImpl.standardMetadataFormatName);
IIOMetadataNode compression = (IIOMetadataNode) root.getElementsByTagName("CompressionTypeName").item(0);
String compressionName = compression.getAttribute("value");

System.out.printf("Compression: %s", compressionName); 

请注意,此压缩名称可能并不总是与插件ImageWriteParam支持的压缩类型名称匹配(尽管通常会这样)。以上内容适用于支持standard or "plug-in neutral" metadata format(大部分)的所有插件。

在任何情况下,如果您想要保持压缩,更安全的选项是使用COPY_FROM_METADATA中的ImageWriteParam压缩模式(这是默认设置,因此您不需要指定它,并将整个metadata对象传递给write方法(记得将其作为图像元数据传递而不是流元数据)。只要读者和作者理解相同的格式,无论支持的元数据格式如何,这都将有效。

实现这一目标的最简单方法可能是使用ImageReader.readAll(..)这样的方法阅读:

IIOImage iioimg = reader.readAll(0, readParam);  // image AND metadata in one go

RenderedImage image = iioimg.getRenderedImage(); // normally a BufferedImage
// ... image manipulation   
iioimg.setRenderedImage(modifiedImage);          // in case the reference changed

writer.write(null, iioimg, writeParam);          // will preserve compression by default

小警告:有些插件的读取器读取的压缩次数超过相应的编写器可以写入的压缩次数。例如。对于TIFF,读者可能会阅读现已弃用的#34;旧式JPEG"压缩,即使作者只支持写新的" JPEG"压缩。