代码之家  ›  专栏  ›  技术社区  ›  SadSido

多次压缩位图

  •  0
  • SadSido  · 技术社区  · 7 年前

    Android API提供 Bitmap.compress(format, quality, output) 保存位图对象的方法。我创建了一个示例应用程序,它将jpeg图像(一些嘈杂的相机照片)加载到位图中,然后将其压缩回同一个文件。然后,再做5次。

    当我压缩质量为100的位图时,得到的文件大小在每次传递时都会线性增加。对于90和80的质量设置,结果文件的大小在每次传递时都保持不变。

    我已经在android5设备(HTC-One)和android6设备(Motorola-Moto-G)上测试过这种行为,结果非常一致。不过,在android7上,(Samsung S7)我看不出结果图像有什么不同。

    所以,我的问题是,为什么用quality=80压缩比quality=90,尤其是quality=100能得到更好的结果。我真的希望用100质量保存图像几乎是无损的(比如说,GIMP)

    2 回复  |  直到 7 年前
        1
  •  1
  •   greeble31    7 年前

    不看例子很难判断,但我假设你注意到的伪影是高频成分(特征是亮度的急剧变化,只持续一两个像素)。尽管不是强制性的,许多.jpeg压缩算法将使用特定的 quantization matrices 衰减高频成分

    因此,不难想象,在较低的质量设置下,高频分量会从图像中“切除”,降低梯度,产生整体“更平滑”的外观。而且,也不难想象,在高质量(但不完美)的情况下,一些高频分量可能会在连续运行中被夸大,甚至被放大(由于量化误差)。

    Dctjpeg.png courtesy of Wikimedia

    (来自维基媒体的原始图片, see here

        2
  •  0
  •   Nabin Bhandari    7 年前

    JPEG是一种有损压缩算法。即使使用100%质量,解码图像也不会与原始图像完全相同。所以,如果您多次对同一图像进行编码和解码,则通常会发现伪影。

    如果你不想有任何损失,就使用PNG算法。

    在使用Photoshop或GIMP编码时,这种损失是无法观察到的,可能是因为他们改进了算法。在android7中比在低版本中更好的结果也可能是相同的结果。