如何使用 ImageIO 获取有关文件压缩的信息?
How to get info about file compression using ImageIO?
我有一个 TIFF 文件,我想知道它使用了哪种压缩方式 - 有没有办法使用 ImageIO 实现它?我试图从 IIOMetadata
对象获取此信息但未成功。我最初从该文件创建一个 BufferedImage
,对其进行处理,然后尝试使用与原始文件相同的压缩方式但使用不同的名称来保存它。
使用 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(大多数支持)的所有插件。
无论如何,如果你想保持压缩,一个更安全的选择是在 ImageWriteParam
中使用 COPY_FROM_METADATA
压缩模式(这是默认的,所以你不需要指定它),并将整个 metadata
对象传递给 write 方法(记住将其作为图像元数据而不是流元数据传递)。无论支持何种元数据格式,只要 reader 和作者理解相同的格式,这都将起作用。
实现此目的的最简单方法可能是使用 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
小提示:一些插件有 readers 读取比相应的编写器可以写入更多的压缩。例如。对于 TIFF,reader 可能能够读取现已弃用的 "Old style JPEG" 压缩,即使编写器仅支持在新的 "JPEG" 压缩中写入。
我有一个 TIFF 文件,我想知道它使用了哪种压缩方式 - 有没有办法使用 ImageIO 实现它?我试图从 IIOMetadata
对象获取此信息但未成功。我最初从该文件创建一个 BufferedImage
,对其进行处理,然后尝试使用与原始文件相同的压缩方式但使用不同的名称来保存它。
使用 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(大多数支持)的所有插件。
无论如何,如果你想保持压缩,一个更安全的选择是在 ImageWriteParam
中使用 COPY_FROM_METADATA
压缩模式(这是默认的,所以你不需要指定它),并将整个 metadata
对象传递给 write 方法(记住将其作为图像元数据而不是流元数据传递)。无论支持何种元数据格式,只要 reader 和作者理解相同的格式,这都将起作用。
实现此目的的最简单方法可能是使用 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
小提示:一些插件有 readers 读取比相应的编写器可以写入更多的压缩。例如。对于 TIFF,reader 可能能够读取现已弃用的 "Old style JPEG" 压缩,即使编写器仅支持在新的 "JPEG" 压缩中写入。