任何图像格式(jpg、PNG、gif)的java图像压缩

任何图像格式(jpg、PNG、gif)的java图像压缩,java,Java,我使用下面给出的代码对jpeg图像进行图像压缩 File input = new File("digital_image_processing.jpg"); BufferedImage image = ImageIO.read(input); File compressedImageFile = new File("compress.jpg"); OutputStream os = new FileOutputStream(compressedImageFile); Iterator&

我使用下面给出的代码对jpeg图像进行图像压缩

File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);

File compressedImageFile = new File("compress.jpg");  
OutputStream os = new FileOutputStream(compressedImageFile);

 Iterator<ImageWriter>writers = ImageIO.getImageWritersByFormatName("jpg");
 ImageWriter writer = (ImageWriter) writers.next();

 ImageOutputStream ios = ImageIO.createImageOutputStream(os);
 writer.setOutput(ios);

 ImageWriteParam param = writer.getDefaultWriteParam();

 param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
 param.setCompressionQuality(0.05f);

 writer.write(null, new IIOImage(image, null, null), param);
File input=新文件(“digital_image_processing.jpg”);
BuffereImage image=ImageIO.read(输入);
File compressedImageFile=新文件(“compress.jpg”);
OutputStream os=新文件OutputStream(compressedImageFile);
Iteratorwriters=ImageIO.getImageWritersByFormatName(“jpg”);
ImageWriter writer=(ImageWriter)writers.next();
ImageOutputStream ios=ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
ImageWriteParam参数=writer.getDefaultWriteParam();
参数setCompressionMode(ImageWriteParam.MODE_显式);
参数设置压缩质量(0.05f);
writer.write(null,新IIOImage(image,null,null),param);
但是当我试图通过更改ImageIO.getImageWritersByFormatName(“PNG”)来使用PNG格式时; 这是给我的错误,压缩不支持


因此,我应该如何修改上述代码以支持所有图像格式压缩

您的代码的问题是您使用了ImageWriter.getDefaultWriteParam()。来自ImageWriter.java的以下引用:

公共映像WriteParam getDefaultWriteParam()

为此返回适当类型的新ImageWriteParam对象 包含默认值的文件格式,即 如果未指定ImageWriteParam对象,则将使用。这是 作为调整几个参数和参数的起点非常有用 否则,只保留默认设置

默认实现构造并返回一个新的 ImageWriteParam对象,不允许平铺、渐进 编码或压缩,并将针对当前 区域设置(即,通过调用new可以得到什么 ImageWriteParam(getLocale())

单个插件可能会返回带有 已启用其他可选功能,或者它们可能返回实例 ImageWriteParam的插件特定子类的

实际行为取决于特定ImageWriteParam的单独实现。我认为JPG image起作用的原因是,JPG的ImageWriteParam为默认ImageWriteParam设置了
canWriteCompressed
protected字段,但对于PNG image,由于某些原因它没有这样做

如果您查看com.sun.imageio.plugins.png.PNGImageWriteParam.java,您会发现它确实没有设置它

为了使代码正常工作,您可以这样做:

  File input = new File("digital_image_processing.jpg");
  BufferedImage image = ImageIO.read(input);

  File compressedImageFile = new File("compress.jpg");  
  OutputStream os = new FileOutputStream(compressedImageFile);

  Iterator<ImageWriter>writers = ImageIO.getImageWritersByFormatName("jpg");
  ImageWriter writer = (ImageWriter) writers.next();

  ImageOutputStream ios = ImageIO.createImageOutputStream(os);
  writer.setOutput(ios);

  ImageWriteParam param = writer.getDefaultWriteParam();
  // Check if canWriteCompressed is true
  if(param.canWriteCompressed()) {
     param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
     param.setCompressionQuality(0.05f);
  }
  // End of check
  writer.write(null, new IIOImage(image, null, null), param);
File input=新文件(“digital_image_processing.jpg”);
BuffereImage image=ImageIO.read(输入);
File compressedImageFile=新文件(“compress.jpg”);
OutputStream os=新文件OutputStream(compressedImageFile);
Iteratorwriters=ImageIO.getImageWritersByFormatName(“jpg”);
ImageWriter writer=(ImageWriter)writers.next();
ImageOutputStream ios=ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
ImageWriteParam参数=writer.getDefaultWriteParam();
//检查canWriteCompressed是否为true
if(param.canWriteCompressed()){
参数setCompressionMode(ImageWriteParam.MODE_显式);
参数设置压缩质量(0.05f);
}
//支票到期
writer.write(null,新IIOImage(image,null,null),param);

更新:我试图找到一种在ImageIO框架内微调PNG图像压缩的方法。但不幸的是,考虑到当前的实现,这几乎是不可能的。Java PNG writer插件有固定过滤-自适应过滤和固定平减级别-9,这是它能做的最好的事情。

可能的重复不是重复,而是完全不同problem@dragon66您正在使用几乎完全相同的代码并得到相同的错误,即使您使用该代码的目的不同reason@immibis:OP使用了相同的代码并得到了相同的错误,这并不意味着它是相同的问题。您引用的那个问题是在寻找答案避免压缩的方法当这个问题想找到一种方法来为所有作者统一设置压缩,我试图给出例外的原因PNG是一种没有压缩的格式,你不能压缩PNG图像,如果你想压缩PNG,你必须考虑更改输出格式。我尝试了上面的代码,但在PNG imag的情况下e图像的大小不是减小,而是减小increasing@AkshayYaduvanshi:以上代码只是例外情况的一种解决方法。与压缩相关的设置对PNG图像无效。控制PNG文件大小的两个因素是:过滤原始数据的第一阶段,然后是压缩过滤数据的第二阶段re有四种类型的过滤选项,您甚至可以自适应地混合这四种。对于deflate压缩,您可以将deflate级别设置为0-9。大小越大,压缩率越高,但速度越慢。@AkshayYaduvanshi:您阅读的原始图像可能已使用其他工具进行了优化(您会发现许多用于此目的的工具)。当您使用默认设置将其保存回PNG时,大小很可能会增加。