如何使用与源图像相同的压缩设置编写修改后的图像

时间:2014-10-11 20:17:28

标签: java javax.imageio imaging jai

用于调查的用例是读取输入图像(tif),修改它并将其写入输出图像(tif)。

我正在寻找一种方便的方法来确保作者使用与原始图像相同的压缩设置等。我还没有通过ImageIO(使用JAI插件)找到一种方便的方法来实现这一目标。 我尝试探测imageReader.getDefaultReadParam(),但它不包含任何注意事项。 imageReader.getImageMetadata(...)包含深入的信息,但数据结构组织没有希望。

此时的回退方法是使用Apache Commons检测压缩(例如,Imaging.getImageInfo(inputFile).getCompressionAlgorithm())并在ImageIO中逻辑设置writer压缩参数。

有没有更优雅的方法来完成这个而不必跳过这个圈?

另外,我不能专门为我们的图像处理任务使用Apache Commons Imaging,因为它还没有完全支持我需要的其他格式,例如。写jpg

由于

1 个答案:

答案 0 :(得分:2)

您正在寻找的方法似乎是:

ImageIO.getImageWriter(ImageReader)

来自API doc:

  

此机制可用于获取ImageWriter,该IIOMetadata将理解由ImageReader生成的非像素元数据(由ImageReader对象编码)的内部结构。通过从ImageWriter获取此数据并将其传递给使用此方法获得的ImageReader reader; reader.setInput(input); IIOImage image = reader.readAll(0, null); // Read image and metadata in one go doStuffWithImage(image.getRenderedImage()); // Most likely safe to cast to BufferedImage ImageWriter writer = ImageIO.getImageWriter(reader); writer.setOutput(output); ImageWriteParam param = writer.getDefaultWriteParam(); // According to the API doc, the default compressionMode is // MODE_COPY_FROM_METADATA which is what we want :-) writer.write(null, image, param); // Don't need stream metadata for TIFF ,客户端程序可以读取图像,以某种方式对其进行修改,并将其写回保留所有元数据,无需了解元数据的结构,甚至是图像格式。

从文档中,您似乎仍然必须将元数据从阅读器传递给编写者,但至少,您不必关心从元数据中获取压缩(或其他)设置。 / p>

实现这一目标的最简单方法可能是:

{{1}}