Технологии

Почему JPEG теряет качество: артефакты, блоки 8×8 и настройки сжатия

Открыли фото, а оно «в квадратиках», вокруг текста — мутный ореол, на чистом небе — полосы? Это не сломанный файл и не плохая камера. Так работает само сжатие JPEG. Разбираем по шагам, что именно формат выбрасывает из вашей картинки, почему это видно — и как настроить сохранение, чтобы артефактов не было.

Камера с диском режимов крупным планом — настройки съёмки и сжатия определяют, сколько деталей доживёт до файла JPEG
Качество JPEG — это не «есть» или «нет», а ползунок. Понимая, что за ним стоит, вы управляете им осознанно. Фото: Pexels

Короткий ответ: почему картинка «плывёт»

JPEG — это формат сжатия с потерями. В отличие от PNG, который хранит каждый пиксель в точности, JPEG ради компактности сознательно выбрасывает часть информации из изображения. Ставка простая: человеческий глаз многого не замечает, так зачем хранить то, чего не видно?

Проблема в том, что глаз не замечает потери до определённого предела. Стоит надавить на сжатие сильнее — и выброшенное становится заметным: вместо плавной картинки появляются квадратики, мутные ореолы и полосы. Это и называется артефактами сжатия. Они не «портятся со временем» и не «глючат» — они впечатаны в файл в момент сохранения и убираются только пересохранением из оригинала.

Главная мысль

JPEG не «теряет качество сам по себе». Он отдаёт ровно столько качества, сколько вы разрешили ему отдать ползунком сжатия. Вся статья — про то, как именно он это делает и где проходит граница «незаметно / уже видно».

Шаг 1: JPEG режет картинку на блоки 8×8

Первое, что делает кодировщик JPEG, — разбивает изображение на сетку из квадратов 8×8 пикселей. Дальше каждый такой блок обрабатывается полностью отдельно от соседей. Это ключевая деталь: JPEG не видит картинку целиком, он видит тысячи маленьких квадратиков и сжимает их по одному.

Внутри блока происходит математическое преобразование — дискретное косинусное преобразование (DCT). Звучит страшно, но идея простая. DCT описывает блок не как 64 отдельных пикселя, а как сумму «волн» разной частоты: плавные перепады яркости — это «низкие частоты», мелкие резкие детали — «высокие частоты». По сути формат переводит картинку с языка «вот значения пикселей» на язык «вот из каких волн она состоит».

Аналогия

Представьте, что блок 8×8 — это аккорд, а DCT раскладывает его на отдельные ноты. Низкие частоты — басы (общий тон блока), высокие — тонкие верхние призвуки (мелкие детали). Пока ничего не потеряно: это просто другой способ записать тот же звук.

Шаг 2: что именно выбрасывается — высокие частоты

Само DCT обратимо и ничего не теряет. Потери начинаются на следующем шаге — квантовании. Здесь JPEG делит каждый коэффициент DCT на число из специальной таблицы и округляет результат. Маленькие значения — а это в первую очередь те самые высокие частоты, мелкие детали — после деления и округления просто превращаются в нули. И вот их-то уже не вернуть.

Почему именно высокие частоты? Потому что глаз к ним наименее чувствителен: лёгкое огрубление мелкой текстуры травы или кожи мы почти не замечаем, а вот общую форму и цвет — сразу. JPEG этим и пользуется: он жертвует деталями, которые «не жалко», и сохраняет то, что бросается в глаза. Именно поэтому формат так хорош для фотографий и так плох для текста — но об этом ниже.

Рабочее место с гистограммами и цветовыми скопами — так профессионалы контролируют, что происходит с яркостью и цветом изображения
Гистограммы и скопы показывают распределение яркости и цвета. Именно по плавным переходам и резким краям JPEG решает, что выбросить. Фото: Pexels

Сила квантования — не фиксированная. Её задаёт параметр качества (об этом — отдельная глава): чем он ниже, тем «грубее» таблица, тем больше коэффициентов обнуляется и тем больше деталей теряется. На качестве 95 выбрасываются только самые незаметные крохи; на качестве 30 — половина того, что делало картинку чёткой.

8×8размер блока сжатия
64коэффициента DCT в блоке
1992год выхода стандарта JPEG

Четыре лица артефактов JPEG

Когда сжатие зашло слишком далеко, потери вылезают наружу в виде узнаваемых дефектов. Научившись их различать, вы сразу понимаете, что именно пошло не так — и что с этим делать.

АртефактКак выглядитГде заметнее всего
БлочностьВидимая сетка квадратов 8×8Небо, кожа, гладкий фон
Ореолы (ringing)Светлая/тёмная «рябь» вдоль краяКонтрастные границы, текст
«Москит»Мерцающая мошка у краёвТекст, логотипы, ветки на небе
БэндингСтупеньки-полосы вместо градиентаЗакаты, плавные заливки

Блочность — самый узнаваемый дефект. Раз каждый блок 8×8 сжимается отдельно, на сильном сжатии соседние блоки получают чуть разную среднюю яркость и цвет — и стыки между ними становятся видны как сетка. Особенно бросается в глаза на ровных участках: чистом небе, коже, студийном фоне.

Ореолы (по-английски ringing) появляются у резких контрастных краёв. Чтобы точно описать резкий перепад, нужно много высоких частот — а их-то JPEG и обрезал. В результате край «звенит»: рядом с ним возникает светло-тёмная рябь, как круги по воде. «Москитный шум» — это та же рябь, но непостоянная: на разных блоках она ложится по-разному, и вокруг буквы или ветки будто роится мошка.

Бэндинг — беда плавных градиентов. Мягкий переход цвета (закатное небо, размытый фон) требует тонких высоких частот; когда квантование их обнуляет, плавность рассыпается на несколько плоских ступенек-полос.

Артефакты необратимы

Раз детали выброшены при сохранении, в файле их больше нет — восстанавливать нечем. «Шумодавы» и нейросети-апскейлеры могут замаскировать квадратики, слегка их размыв или дорисовав правдоподобную текстуру, но настоящие потерянные детали они не возвращают. Единственный надёжный способ — взять оригинал и сохранить его с более высоким качеством.

Цвет в половинном разрешении: chroma subsampling

Есть ещё один источник потерь, о котором мало кто знает, — субдискретизация цветности (chroma subsampling). Перед сжатием JPEG разделяет картинку на яркость (насколько пиксель светлый) и цветность (какого он оттенка). Сделано это не случайно: глаз очень чувствителен к яркости и куда хуже различает мелкие детали именно цвета.

JPEG этим пользуется и хранит цвет в пониженном разрешении. В самом частом режиме 4:2:0 на каждые четыре пикселя яркости приходится всего один общий замер цвета — то есть цветовая информация ужимается вдвое по обеим осям. На фотографии это почти незаметно: яркость-то полная. Но там, где встречаются резкая граница двух цветов — красный текст на синем фоне, цветной интерфейс, — цвет «расплывается» за край, потому что хранится грубее картинки.

Обработка городских фотографий на ноутбуке — на фото снижение разрешения цвета незаметно, а на тексте и графике оно бьёт по чёткости
На реальных фото субдискретизация цвета почти не видна. Проблемы начинаются на тексте и графике с резкими цветными краями. Фото: Pexels

Параметр качества: какой ставить

Когда вы сохраняете JPEG, программа спрашивает «качество» от 0 до 100. На деле это рукоятка силы квантования: 100 — почти ничего не выбрасываем, 0 — выбрасываем всё, что можно. Важно понимать, что качество не линейно: между 100 и 90 разница в размере огромная, а на глаз — почти нулевая. А вот между 60 и 40 размер меняется мало, зато артефакты лезут стремительно.

90–100
Печать, важные кадры, архив. На глаз неотличимо от оригинала
80–90
Золотая середина для веба и соцсетей: малый размер, артефактов не видно
70–80
Экономия трафика. На сложных текстурах артефакты уже можно разглядеть
ниже 70
Заметная блочность и ореолы. Только когда вес критичнее качества

Практический вывод: для фотографий держитесь диапазона 80–90 — это лучший баланс «лёгкий файл / нет видимых потерь». Поднимать выше 95 почти бессмысленно: размер растёт быстро, а заметной прибавки в качестве нет. А если вы конвертируете уже готовый JPEG, помните — повысить качество задним числом нельзя: что выброшено в исходнике, того в нём уже нет.

Ставить JPEG на 100 — всё равно что бережно хранить фотографию, которую уже надорвали. Качество задаётся в момент первого сохранения, а не при копировании.

Потери поколений: смерть от пересохранений

Вот сценарий, который тихо убивает миллионы фотографий. Вы открываете JPEG, чуть подправляете яркость, сохраняете. Завтра открываете снова, кадрируете, опять сохраняете. И так несколько раз. С каждым разом картинка становится всё хуже — даже если вы почти ничего не меняли. Это и есть потери поколений.

Причина в том, что каждое сохранение JPEG — это новый полный цикл сжатия с потерями. Программа заново режет картинку на блоки 8×8, заново делает DCT и заново квантует, выбрасывая детали. Хуже того: сетка блоков при пересохранении часто сдвигается и не совпадает с прошлой, поэтому формат заново «портит» даже те места, которые в прошлый раз остались целыми. Артефакты не перезаписываются — они накапливаются, поколение за поколением, как при многократном ксерокопировании ксерокопии.

1

Редактируйте из оригинала

Храните исходник (RAW или JPEG из камеры) и каждый раз правьте копию из него, а не результат прошлой правки.

2

Работайте без потерь

В процессе редактирования держите файл в формате без потерь — PNG или TIFF. Так промежуточные сохранения не накапливают артефакты.

3

В JPEG — один раз, в конце

Сжимайте в JPEG только финальную версию, перед самой публикацией. Одно сжатие вместо десяти — и фото остаётся чистым.

Сохраните фото без потерь — пока есть оригинал

Собираетесь много редактировать или нужна полная чёткость текста и графики? Переведите JPEG в PNG: формат без потерь не добавит ни одного нового артефакта при дальнейших сохранениях. Бесплатно, прямо в браузере.

Конвертировать JPG в PNG

Когда JPEG просто не подходит

JPEG гениален ровно для той задачи, под которую создан, — фотографии. Плавные переходы тонов, мягкие текстуры, отсутствие резких контуров: здесь потеря высоких частот незаметна, а файл выходит в разы легче PNG. Для снимков с камеры и телефона это идеальный формат.

А вот там, где картинка состоит из резких краёв и сплошных цветов, JPEG проваливается — потому что выбрасывает именно то, что эту графику и держит:

  • Текст и скриншоты. Буквы и линии — это сплошные высокие частоты. JPEG обрастает их ореолом и «москитом», текст становится грязным. Нужен PNG.
  • Логотипы и графика с плоскими заливками. Чёткие границы цвета размывает и блочность, и субдискретизация цветности.
  • Изображения с прозрачностью. JPEG её в принципе не умеет — прозрачный фон станет белым. Только PNG.
  • Файлы для дальнейшего редактирования. Чтобы не копить потери поколений, промежуточные версии держат без потерь.

Если же вам, наоборот, нужен компактный фотоформат поновее, обратите внимание на WebP: при сравнимом качестве он обычно весит меньше JPEG — попробовать можно в конвертере JPG → WebP. А когда понадобится вернуть фото из PNG обратно в лёгкий JPEG для публикации, поможет PNG → JPG. Полный список преобразований — на странице всех форматов.

Простое правило выбора

Фотография без резких контуров — JPEG (качество 80–90). Текст, скриншот, логотип, прозрачность или файл «на будущее редактирование» — PNG. Это решение экономит больше нервов, чем любой шумодав.

Объектив камеры крупным планом — для снимков с плавными переходами JPEG остаётся отличным выбором
Для фотографии с её плавными переходами JPEG — по-прежнему отличный инструмент. Главное — понимать его границы. Фото: Pexels
JPEG сжимает картинку квадратами 8×8 пикселей и в каждом отбрасывает «высокие частоты» — резкие детали. Чем сильнее сжатие, тем больше деталей выброшено: соседние квадраты перестают совпадать по яркости и становятся видны как сетка, а резкие края обрастают мутным ореолом. Это и есть артефакты сжатия.
Полностью — нет. Потери при сжатии необратимы: выброшенные детали в файле не хранятся, восстанавливать их нечем. Фильтры шумоподавления могут слегка размыть квадратики, но настоящую резкость не вернут. Единственный надёжный путь — пересохранить из оригинала с более высоким качеством, пока оригинал ещё есть.
Для фотографий 80–90 — почти неотличимо от оригинала при заметно меньшем размере. 90–95 — для печати и важных кадров. Ниже 70 артефакты становятся видны. Для скриншотов, текста и графики JPEG лучше вообще не использовать — выбирайте PNG.
JPEG заточен под плавные переходы реальных фотографий, где потеря мелких деталей незаметна. Текст, линии и интерфейсы состоят из резких контрастных краёв — именно тех «высоких частот», которые JPEG выбрасывает в первую очередь. Поэтому буквы обрастают ореолом и «москитным шумом». Для такой графики нужен формат без потерь — PNG.
Каждое пересохранение JPEG — это новый цикл сжатия с потерями. Программа заново делит картинку на блоки и снова отбрасывает детали, причём сетка блоков не совпадает с прошлым разом. Артефакты накапливаются: после десятка пересохранений фото заметно «плывёт». Поэтому редактировать лучше из оригинала или в формате без потерь, а в JPEG сохранять один раз — в самом конце.