使用Java ImageIO进行Tiff压缩

我在将png转换为tiff时遇到问题。 转换很顺利,但图像很大。 我认为问题是我没有正确地进行压缩? 任何人都有任何建议?

这是代码示例

public static void test() throws IOException { // String fileName = "4958813_1"; String fileName = "4848970_1"; String inFileType = ".PNG"; String outFileType = ".TIFF"; ImageIO.scanForPlugins(); File fInputFile = new File("I:/HPF/UU/" + fileName + inFileType); InputStream fis = new BufferedInputStream(new FileInputStream( fInputFile)); PNGImageReaderSpi spi = new PNGImageReaderSpi(); ImageReader reader = spi.createReaderInstance(); ImageInputStream iis = ImageIO.createImageInputStream(fis); reader.setInput(iis, true); BufferedImage bi = reader.read(0); TIFFImageWriterSpi tiffspi = new TIFFImageWriterSpi(); ImageWriter writer = tiffspi.createWriterInstance(); //Iterator iter = ImageIO.getImageWritersByFormatName("TIFF"); //ImageWriter writer = iter.next(); ImageWriteParam param = writer.getDefaultWriteParam(); param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionType("LZW"); param.setCompressionQuality(0.5f); File fOutputFile = new File("I:\\HPF\\UU\\" + fileName + outFileType); ImageOutputStream ios = ImageIO.createImageOutputStream(fOutputFile); writer.setOutput(ios); writer.write(bi); } 

Writer.getDefaultWriteParam()只创建一个ImageWriteParam对象,它不会将它链接回任何其他对象。

我没有在您的代码中看到任何修改后的param对象随后在ImageWriter使用的机制。

我相信而不是:

 writer.write(bi); 

你需要使用:

 writer.write(null, new IIOImage(bi, null, null), param); 

我不了解Java IO,但通常你想看几件事

  1. 你能用JPEG压缩代替LZW吗?
  2. 了解如何设置TIFF条带大小 – 如果您想要小尺寸,请将其设置为图像的高度。

编辑:看起来像TiffWriteParam有以下方法

 tiffWriteParam.setTilingMode(ImageWriteParam.MODE_EXPLICIT); tiffWriteParam.setTiling(imageWidth, imageHeight, 0, 0); 

将imageWidth和imageHeight变量设置为图像的大小。 缺点是读出图像区域会更慢。