2008-11-11 148 views
5

我遇到问题将png转换为tiff。转换进行得很好,但图像很大。我认为问题是我没有正确地进行压缩?任何人有任何建议?使用Java ImageIO的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<ImageWriter> 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); 

} 

回答

9

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

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

我相信不是:

writer.write(bi); 

你需要使用:

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

我不知道Java的IO,但通常你想看看几件事情

  1. 你可以使用JPEG压缩,而不是LZW?
  2. 了解如何设置TIFF条的大小 - 如果小尺寸是您想要的,请将其设置为图像的高度。

编辑:看起来像一个TiffWriteParam有以下几种方法

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

设置imageWidth和imageHeight瓦尔到图像的尺寸。缺点是读出图像的区域会变慢。