2013-10-16 40 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这是否回答您的问题? –