2014-10-09 95 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); 

希望這有助於。