2014-10-09 97 views
-1

我想在上传文件时进行jpeg无损压缩,这是我测试过的代码,我无法执行它(运行时错误),附加的异常代码,我是否什么在进行jpeg无损压缩时Java高级图像错误

InputStream inputStream = new FileInputStream("E:\\pics\\Original\\testCompress\\bouncy-crayon-playland-2.JPG"); 
      BufferedImage image = ImageIO.read(inputStream);       
      JPEGImageWriter writer = (JPEGImageWriter) ImageIO.getImageWritersByFormatName("JPEG-LS").next();  
      ImageWriteParam param = writer.getDefaultWriteParam(); 
      param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
      param.setCompressionType("JPEG-LS");   
      writer.setOutput(ImageIO.createImageOutputStream(new File("E:\\pics\\Original\\testCompress\\bouncy-crayon-playland-2-compressed.JPG")));  
      writer.write(null, new IIOImage(image, null, null), param); 

它给错误:

Exception in thread "main" java.util.NoSuchElementException 
      at javax.imageio.spi.FilterIterator.next(Unknown Source) 
      at javax.imageio.ImageIO$ImageWriterIterator.next(Unknown Source) 
      at javax.imageio.ImageIO$ImageWriterIterator.next(Unknown Source) 

有什么建议?

回答

2

您的错误是由于标准Java不支持JPEG-LS。当你的代码执行:

ImageIO.getImageWritersByFormatName("JPEG-LS").next(); 

它看起来对现有可处理的JPEG-LS格式“ImageWriters”,但有没有,所以你与NoSuchElementException异常警告。

如果要压缩的JPEG-LS图像,检查此线程:How to achieve jpeg lossless?

不过,我为了得到它的工作改变了你的代码。

InputStream inputStream; 
     try { 
      inputStream = new FileInputStream("E:\\pics\\Original\\testCompress\\bouncy-crayon-playland-2.JPG"); 
      BufferedImage image = ImageIO.read(inputStream);    
      ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();  
      ImageWriteParam param = writer.getDefaultWriteParam(); 
      param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
      param.setCompressionQuality(1);  
      writer.setOutput(ImageIO.createImageOutputStream(new File("E:\\pics\\Original\\testCompress\\bouncy-crayon-playland-2-compressed.JPG")));  
      writer.write(null, new IIOImage(image, null, null), param); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

此代码不能在JPEG-LS压缩,但它降低了图像的大小(理论上失去了最起码的质量)的使用:

param.setCompressionQuality(1); 

希望这有助于。