使用setCompressionQuality进行最大可能的图像压缩

时间:2014-06-14 08:20:35

标签: java image-compression

在开始之前,不,这不是Theoretical Limit to Compression可能重复的问题。我只需要找到一种比使用JAVA压缩图像几百个字节的方法。

我一直试图压缩5kB图像。最大压缩将其减少到980字节,这非常有效,但我需要将其压缩到至少500字节。

这是我的代码段:

  File compressedImageFile = new File("D:\\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.01f);
  writer.write(null, new IIOImage(image, null, null), param);
  os.close();
  ios.close();
  writer.dispose();

这里,compressedImageFile是我从输入图像文件中获得的缓冲图像。 并且,在param.setCompressionQuality(0.01f)行中,无论我设置的值多少0.01f,它都没有什么区别。 0.01f是压缩的下限吗?

如果是这样,有什么方法可以进一步压缩它吗?

2 个答案:

答案 0 :(得分:0)

如果没有自己的图像,那么在这个特定的例子中,任何人都无法回答你的问题。关于压缩理论的事情是,你是否想要&#34;非常小&#34;并不重要。值 - 任何所需的压缩大小都是不可能的。

对于任何给定的算法,有5kb图像,你甚至可以压缩到4.99kb以下。对于您的给定图像,Java中的Kolmogrov Complexity可能很好地为980字节,在这种情况下,世界上没有可以将其压缩到500的Java代码。按照副本中的链接查看为什么你要求的可能是不可能的。 (同样,如果没有实际的图像字节,没有人可以确定是否存在一个算法将其降低到500字节)。

答案 1 :(得分:0)

传递给setCompressionQuality方法的值是float值,其值介于0.0f和1.0f之间。然而,压缩不是什么&#34;连续&#34;或&#34;线性&#34;从这个意义上说。您无法想象具有100个字节的文件将具有100个字节(质量为1.0),50个字节(质量为0.5)和0个字节(质量为0.0)。同样,对于0.000001和0.000002的质量,您不能指望压缩的差异。

传递给此方法的值用于内部计算,尤其是用于设置JPEG量化表。您可能希望查看javax.imageio.plugins.jpeg包中的类,但是......如果没有深刻的背景知识,您将无法理解它们。在任何情况下,0.0和1.0之间的值必须以任何形式离散化粗略说话:它可以转换为0到255之间的int值,因此0.01和0.00的压缩可能没有区别,因为两个值都将转换为相同int值 - 即0。

这可以解释为什么&#34;小&#34;的压缩没有区别?价值观的差异。图像文件几乎不能被压缩为任意小的原因是由于所使用的算法所暗示的压缩存在限制。当然,您可以创建一个类似JPEG的压缩,其中最高压缩将图像转换为一个大的矩形,其中一种颜色理论上可以(!)存储为单个字节(或者可能是3个字节)。但这并不适用于JPEG压缩。

https://stackoverflow.com/a/22016608/3182664中,我发布了一个小型实用程序,可让您调整所需的图像大小和所需的压缩。例如,您可以选择10kB的文件大小,程序将计算实现此文件大小所需的压缩级别。但是,这将允许您实现比手动设置0.0的质量更高的压缩。


编辑:关于参考信息理论的评论和其他答案:这在这里并不适用。理论上,当接受原始图像的所有信息丢失时,理论上可以将任意大而复杂的图像压缩为仅大3个字节。 JPEG 有损压缩,某些信息信息 信息 因此,它与信息理论无关,而只是与人们愿意接受多少信息丢失以及JPEG标准支持的问题有关。 (例如,每个JPEG文件可能必须包含一些信息,如量化表,无论实际图像内容如何,​​都可能总是占用几个字节)。