【问题标题】:Java Advanced Imaging error while doing jpeg lossless compression进行 jpeg 无损压缩时出现 Java 高级成像错误
【发布时间】:2023-04-07 17:32:01
【问题描述】:

我想在上传文件时做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


    【解决方案1】:

    您的错误是由于标准 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);   
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-09-28
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 2010-12-12
      相关资源
      最近更新 更多