Как уменьшить размер JPEG без потери качества
Практическое руководство: как сжимать JPEG, сохраняя важные детали, и какая настройка кодировщика испорчена почти во всех онлайн-инструментах.
Почти любой инструмент «сжать изображение» идёт на одну и ту же молчаливую сделку: выбрасывает половину информации о цвете и надеется, что вы не заметите. Заметно это обычно на тонах кожи, красных цветах, тонком цветном тексте и любых фото с резкими цветными границами. Ползунки качества тут не помогают — это не проблема качества.
Что на самом деле делает JPEG большим
JPEG хранит яркость в полном разрешении, а цвет — в пониженном. Это соотношение называется субдискретизацией цветности:
- 4:4:4 — цвет в полном разрешении. Максимальная точность, самый большой файл.
- 4:2:2 — цвет в половинном горизонтальном разрешении. Визуально близко к 4:4:4 для большинства фотографий.
- 4:2:0 — цвет вдвое уменьшен в обоих направлениях. Три четверти цветовых данных потеряны.
Многие камеры и генераторы изображений экспортируют 4:4:4. Многие кодировщики, когда у них просят JPEG «для веба» или «сжатый», незаметно переводят его в 4:2:0. Это преобразование необратимо: цветовые детали отбрасываются ещё до того, как спрашивают хоть какой-то ползунок качества.
Мы измерили это на 323 изображениях: то же качество, изменена только дискретизация. SSIMULACRA2 упал в среднем с 87,8 до 82,7 — ухудшилось каждое изображение без исключения, 47 % более чем на 5 пунктов, худшее — на 17. Повышение качества JPEG этого не возвращает.
Число качества — не процент
Качество JPEG 80 не означает «80 % от оригинала». Это индекс в таблице шагов квантования, определённой в 1992 году и не имеющей физического смысла. Два кодировщика, оба заявляющие качество 80, могут различаться по размеру файла на 40 % при одинаковом визуальном качестве.
Практические диапазоны для фотографического контента:
- q90–q95 — в сравнении бок о бок не отличить от оригинала.
- q80–q85 — обычная золотая середина для веба. Как правило, на 60–75 % меньше экспорта в q99.
- q60–q70 — нормально для миниатюр и фонов, заметное размытие в мелкой текстуре.
- ниже 50 — на градиентах становится очевидна блочность.
Что этот инструмент делает иначе
Мы считываем субдискретизацию цветности из заголовка файла до того, как его тронуть, и оставляем её без изменений. Если ваше изображение 4:4:4 — оно останется 4:4:4. Большинство инструментов не могут сказать, что использовал ваш файл; мы показываем это для каждого изображения до сжатия.
Ещё мы не тратим ваше качество впустую. Если файл уже сжат (скажем, более ранний экспорт в q70), перекодирование в q80 сделает файл больше, не улучшив вид: кодировщик тратит биты на описание артефактов прошлого сжатия. Мы распознаём этот случай и вместо угадывания выполняем проход без потерь: энтропийное кодирование перезаписывается, данные изображения остаются идентичными бит в бит. На baseline-JPEG это обычно экономит около 4 %.
Рабочий порядок действий
- Начните с q80 при включённом сохранять исходную цветовую дискретизацию.
- Проверьте результат при 100 % на участке с мелкими цветовыми деталями, а не на небе.
- Если всё ещё велико, используйте режим целевого размера и задайте лимит, который реально нужен, — например 200 КБ для загрузки в форму.
- Никогда не сжимайте уже сжатый файл второй раз, если можете вернуться к оригиналу.
Всё работает в вашем браузере. Изображения никуда не загружаются.