2013-10-16 42 views
0

我目前正在使用下面的代碼壓縮TIFF圖像到一個較小的JPG文件:Java的TIFF圖像壓縮與使用javax

public ImageHandler(String srcPath, String destPath, float qual) throws IOException{ 
    this.pathToSourceImage = srcPath; 
    this.pathToDestImage = destPath; 
    this.quality = qual; 
    this.sourceImage = new File(pathToSourceImage); 
    this.destImage = new File(pathToDestImage); 
    this.srcInStream = new FileInputStream(sourceImage); 
    this.destOutStream = new FileOutputStream(destImage); 
} 

private void compress() throws IOException{ 
     BufferedImage image = ImageIO.read(srcInStream); 
     System.out.println("Got the bufferedImage"); 
     Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg"); 

     if(!writers.hasNext()){ 
      throw new IllegalStateException("No Writers Found!"); 
     } 

     ImageWriter writer = (ImageWriter) writers.next(); 
     ImageOutputStream imageOutStream = ImageIO.createImageOutputStream(destOutStream); 
     writer.setOutput(imageOutStream); 

     ImageWriteParam param = writer.getDefaultWriteParam(); 

     //Compress at quality 
     param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
     param.setCompressionQuality(quality); 

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

     srcInStream.close(); 
     destOutStream.close(); 
     imageOutStream.close(); 
     writer.dispose(); 


    } 


public static void main(String args[]){ 
     String tifPath = "C:\\00000000.090.tif"; 
     String compressedJpgPath = "C:\\compressed.jpg"; 
     float quality = 0.5f; 

     try{ 
      ImageHandler testHandler = new ImageHandler(tifPath, compressedJpgPath, quality); 
      testHandler.compress(); 
     }catch(IOException e){ 
      e.printStackTrace(); 
     } 
    } 

即使我可以得到它成功地讀取源TIF到緩衝區,但仍引發以下錯誤:

Exception in thread "main" java.lang.IllegalArgumentException: image == null! 
at javax.imageio.IIOImage.<init>(IIOImage.java:109) 
at fjimagecompressor.ImageHandler.compress(ImageHandler.java:82) 
at fjimagecompressor.ImageHandler.main(ImageHandler.java:99) 

在生產線:

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

如何圖像報告自己爲null,即使它不是?

+0

你有完整的堆棧跟蹤嗎? –

+0

@mattforsythe添加爲原文 – user1806716

+1

請注意'ImageIO.read()'可以返回'null'。 – kiheru

回答

0

我懷疑ImageIO.read(srcInStream);的調用返回null(表示您沒有爲TIFF註冊的ImageReader)。你怎麼知道你成功地閱讀了圖片?

+0

我以爲ImageIO有一個爲tiff內置的註冊圖像閱讀器?或者你是否說我需要一些其他外部api下載TIFF圖像閱讀器? – user1806716

+0

它似乎沒有註冊的ImageReader開箱即用。 (當我調用'ImageIO.getImageReadersByFormatName(「TIFF」)'我找回了一個空的Iterator。)你可能需要第三方。我認爲TIFF有許可問題。 –

+0

@ user1806716這是否回答您的問題? –