Android提供了保存位图对象的Bitmap.compress(format, quality, output)方法。我创建了一个示例应用程序,它将一个jpeg图像(一些嘈杂的相机照片)加载到位图中,然后将其压缩回同一个文件。然后,再做5次。
显然,我的位图积累了压缩伪影。令我惊讶的是,这些工件的数量以一种奇怪的方式依赖于压缩的质量。当我将质量设置为100 (我希望这是最好的质量)时,工件是明显可见的。当我把质量降到90时,工件就明显地变得不明显了。质量设置为80给我最好的结果。当质量设置为70及以下时,图像会迅速退化。
当我用100质量压缩位图时,结果文件的大小在每次传递时都会线性增加。对于90和80的质量设置,每次传递结果文件的大小都保持不变。
我在Android 5设备(HTC One)和Android 6设备(摩托罗拉Moto G)上测试了这种行为,而且测试结果非常一致。不过,在安卓7(三星S7)上,我找不到任何不同的结果图像。
所以,我的问题是,为什么压缩质量= 80比质量= 90,特别是质量= 100,给我们更好的结果。我真的希望保存100个质量的图像几乎是无损的(比如,GIMP)。
发布于 2018-10-31 14:41:37
很难不看到例子,但我假设你注意到的是高频成分(特征是亮度的急剧变化,只持续一两个像素)。虽然不是强制性的,但许多.jpeg压缩算法将使用特定的量化矩阵,在较低的质量设置下更多地衰减高频分量,从而为您可能认为对图像更“基本”的低频内容腾出空间。
因此,不难想象,在质量较低的情况下,高频成分将被“切掉”图像,降低梯度,并产生一个整体“更平滑”的外观。而且,不难想象,随着高(但不完美)质量,一些高频成分可能被夸大,甚至放大(由于量化误差),在连续运行。
换句话说,JPEGs宏块由以下8x8原语的线性组合组成,在质量较低的设置中,靠近右侧和底部的原语不太可能出现,因此:没有锋利的边缘。

(原始图片来自维基媒体,请看这里)
发布于 2018-10-31 08:21:29
JPEG是一种有损压缩算法。即使您使用100%的质量,解码后的图像也不会与原始图像相同。因此,如果您多次对同一图像进行编码和解码,那么查找工件是常见的。
如果您不想要任何损失,请使用PNG算法。
我的回答有点不完整,因为80%的人不应该有比100%更好的质量,如果这种情况发生在你们的情况下,我不知道为什么。
在使用Photoshop或GIMP进行编码时,损失是不可观察的,这可能是因为他们改进了算法。Android 7比低版本更好的结果也可能是同样的结果。
https://stackoverflow.com/questions/53078975
复制相似问题