执行jpeg无损压缩时发生Java高级图像错误

执行jpeg无损压缩时发生Java高级图像错误,java,Java,我想在上传文件时做jpeg无损压缩,这是我写的测试代码,无法执行运行时错误,附加异常代码,我做了什么吗 InputStream inputStream = new FileInputStream("E:\\pics\\Original\\testCompress\\bouncy-crayon-playland-2.JPG"); BufferedImage image = ImageIO.read(inputStream);

我想在上传文件时做jpeg无损压缩,这是我写的测试代码,无法执行运行时错误,附加异常代码,我做了什么吗

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)

有什么建议吗?

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

ImageIO.getImageWritersByFormatName("JPEG-LS").next(); 
它查找处理JPEG-LS格式的现有ImageWriter,但没有,因此您会收到NoTouchElementException警告

如果要压缩JPEG-LS格式的图像,请选中此线程:

但是,为了让它工作,我已经更改了您的代码

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);   
希望这有帮助