Значение, которое передается методу setCompressionQuality
, является значением float
, которое должно находиться в диапазоне от 0,0f до 1,0f. Однако сжатие не является чем-то «непрерывным» или «линейным» в этом смысле. Вы не можете себе представить, что файл со 100 байтами будет иметь 100 байт для качества 1,0, 50 байт для качества 0,5 и 0 байт для качества 0,0. Точно так же нельзя ожидать разницы в сжатии для качества 0,000001 и 0,000002.
Значение, которое передается этому методу, используется для внутренних вычислений, в частности, для настройки таблицы квантования JPEG. Вы можете ознакомиться с классами из javax.imageio.plugins.jpeg, но... ожидайте, что вы не поймете их без глубоких базовых знаний. В любом случае значение от 0,0 до 1,0 должно быть дискретизировано в любой форме. Грубо говоря: оно может быть преобразовано в значение int
от 0 до 255, поэтому может не быть разницы в сжатии для 0,01 и 0,00, поскольку оба значения будут преобразованы в одно и то же значение int
, а именно 0.
Это может объяснить, почему нет разницы в сжатии для «небольших» различий в значениях. Причина, по которой файл изображения вряд ли может быть сжат до сколь угодно малого размера, заключается в том, что существует предел сжатия, подразумеваемый используемым алгоритмом. Конечно, вы можете создать собственное сжатие наподобие JPEG, где максимальное сжатие превращает изображение в большой прямоугольник с одним цветом, который теоретически (!) может храниться как один байт (или, может быть, 3 байта). Но это просто не предназначено для сжатия JPEG.
В https://stackoverflow.com/a/22016608/3182664 я разместил небольшое служебное приложение, которое позволяет вам настроить желаемое размер изображения и желаемое сжатие. Например, вы можете выбрать размер файла 10 КБ, и программа рассчитает уровень сжатия, необходимый для достижения этого размера файла. Однако это не позволит вам добиться более высокого уровня сжатия, чем при ручной установке качества 0,0.
РЕДАКТИРОВАТЬ: Что касается комментариев и других ответов, относящихся к теории информации: здесь это не совсем применимо. Произвольное большое и сложное изображение теоретически может быть сжато до размера всего 3 байта, при условии, что вся информация об исходном изображении будет потеряна. JPEG является сжатием с потерями, и некоторая информация теряется для всех настроек качества, кроме самого высокого. Так что это не связано с теорией информации, а просто с вопросом о том, какую потерю информации человек готов принять и что поддерживается стандартом JPEG. (Например, каждый файл JPEG может содержать некоторую информацию, такую как таблица квантования, которая всегда может занимать несколько байтов независимо от фактического содержимого изображения).
person
Marco13
schedule
14.06.2014