2008-11-11 151 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瓦爾到圖像的尺寸。缺點是讀出圖像的區域會變慢。