Java 如何使用ImageIO获取有关文件压缩的信息?
我有一个TIFF文件,我想知道它使用了哪种压缩方式——有没有办法用ImageIO实现它?我试图从Java 如何使用ImageIO获取有关文件压缩的信息?,java,image-processing,compression,tiff,Java,Image Processing,Compression,Tiff,我有一个TIFF文件,我想知道它使用了哪种压缩方式——有没有办法用ImageIO实现它?我试图从iimetadata对象获取此信息,但未成功。我首先从该文件创建一个buffereImage,对其进行处理,然后尝试使用与原始文件相同但名称不同的压缩来保存它。使用ImageIO API,以下代码将为您提供压缩(以人类可读的方式): 请注意,此压缩名称可能并不总是与插件的ImageWriteParam支持的压缩类型名称匹配(尽管它经常匹配)。以上内容适用于所有支持的插件(大多数都支持) 在任何情况下,
iimetadata
对象获取此信息,但未成功。我首先从该文件创建一个buffereImage
,对其进行处理,然后尝试使用与原始文件相同但名称不同的压缩来保存它。使用ImageIO API,以下代码将为您提供压缩(以人类可读的方式):
请注意,此压缩名称可能并不总是与插件的ImageWriteParam
支持的压缩类型名称匹配(尽管它经常匹配)。以上内容适用于所有支持的插件(大多数都支持)
在任何情况下,如果要保持压缩,更安全的选择是在ImageWriteParam
中使用COPY\u FROM\u METADATA
压缩模式(这是默认设置,因此不需要指定),并将整个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,读卡器可能能够读取现在不推荐使用的“旧式JPEG”压缩,即使编写器只支持使用新的“JPEG”格式编写压缩。您真的需要保存的文件吗?还是只为了获取信息而保存?如果您只需要保存信息,则保存是个坏主意,因为加载和保存可能会丢失数据(例如,tiff的多页属性或Java不完全支持的其他选项)。您需要文件信息我根本不会使用ImageIO-直接解析文件(或使用执行此操作的库)。我真的需要处理它,然后保存它-通常分为几个部分,我希望它们以与原始图像相同的压缩类型保留下来。您可以使用
tiffdump yourmage.tif | grep compression
然后查找TIFF标记259来解释值。或者您可以使用identifite-verbose yourmage.tif | grep compression
,其中是ImageMagick的一部分,安装在大多数Linux发行版上,可用于macOS和Windows。有一个名为im4java
“我试图从iimetadata
对象获取此信息,但未成功。”您能显示您尝试的代码吗?它应该可以工作。
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