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