Android API предоставляет метод Bitmap.compress(format, quality, output)
для сохранения растровых объектов. Я создал пример приложения, которое загружает изображение JPEG (некоторая фотография с шумной камерой) в растровое изображение, а затем сжимает его обратно в тот же файл. Затем делает это снова 5 раз.
Очевидно, мое растровое изображение накапливает артефакты сжатия. Удивительно для меня, количество этих артефактов странным образом зависит от качества сжатия. Когда я устанавливаю качество на 100 (что я ожидаю, чтобы быть лучшим качеством), артефакты отчетливо видны. Когда я понижаю качество до 90, артефакты становятся значительно менее заметными. Настройка качества 80 дает мне лучшие результаты. При настройке качества 70 и ниже изображение быстро ухудшается.
Когда я сжимаю растровые изображения с качеством 100, размер получаемого файла линейно увеличивается при каждом проходе. Для параметров качества 90 и 80 размер получаемого файла остается примерно одинаковым при каждом проходе.
Я протестировал это поведение на устройстве Android 5 (HTC One) и на устройстве Android 6 (Motorola Moto G), и оно было вполне последовательным. Однако на Android 7 (Samsung S7) я не заметил никакой разницы в полученных изображениях.
Итак, мой вопрос: почему сжатие с качеством = 80 дает нам лучшие результаты, чем качество = 90 и особенно качество = 100. Я действительно ожидал, что сохранение изображений с качеством 100 будет почти без потерь (как, например, в GIMP)