Откройте любой файл .jpg в hex-редакторе. Первые два байта:
FF D8
Это маркер начала изображения (Start of Image). Каждый JPEG-файл начинается с него. Каждый JPEG-декодер на Земле ищет его. Следующие байты сообщают декодеру, какой вариант JPEG это есть, какое цветовое пространство ожидать и где начинаются данные пикселей. Формат старше веб-браузера, но всё ещё составляет примерно 57% всех изображений, передаваемых в современном интернете, согласно Web Almanac 2025.
Кризис хранения, который породил JPEG
В 1986 году raw-изображение в градациях серого 640 × 480 съедало 307 КБ дискового пространства. Цветное изображение того же разрешения требовало 921 КБ. В то время, когда жёсткий диск на 20 МБ стоил сотни долларов, а дискеты на 1,44 МБ были стандартным носителем обмена, одна несжатая фотография могла занять две трети диска.
Потребность была очевидна: стандартный формат сжатия для изображений с непрерывным тоном — фотографий, а не векторной графики. Несколько групп работали над этой проблемой. Joint Photographic Experts Group, созданный в 1986 году ISO/IEC и ITU-T, объединил лучшие идеи в единый черновик. После шести лет доработки стандарт был опубликован в 1992 году как ISO/IEC 10918-1.
JPEG никогда не предназначался быть единственным форматом изображений. Он был разработан для одной задачи: делать фотографии достаточно маленькими для хранения и передачи. Он выполняет эту задачу, отбрасывая информацию в очень строгом порядке.
Почему JPEG так хорошо сжимает
Сжатие JPEG — это конвейер, а не один алгоритм. Каждый этап удаляет данные, которые зрительная система человека с наименьшей вероятностью заметит.
1. Преобразование цветового пространства (RGB → YCbCr)
Ваш экран отображает RGB. JPEG хранит YCbCr. Канал Y несёт яркость (luminance). Каналы Cb и Cr несут цветность (chrominance, разность синего и разность красного). Это важно, потому что человеческий глаз имеет около 2,5 миллиона колбочек, настроенных на яркость, и только 100 000, настроенных на цвет. Мы видим детали яркости гораздо лучше, чем детали цвета.
2. Субдискретизация цветности (Chroma Subsampling)
Большинство JPEG используют субдискретизацию 4:2:0. На каждые 4 выборки яркости приходится по 1 выборке Cb и 1 выборке Cr. Это означает, что цветностные каналы хранятся в четверть разрешения канала яркости. Для изображения 4000 × 3000 плоскость Y имеет полное разрешение. Плоскости Cb и Cr — 2000 × 1500 каждая. Вы только что сократили сырые данные примерно на 50% ещё до начала какого-либо реального сжатия, и большинство зрителей этого не замечают.
3. Дискретное косинусное преобразование (DCT)
Изображение разбивается на блоки 8 × 8 пикселей. Каждый блок пропускается через DCT, которое преобразует пространственные данные (значения пикселей) в частотные данные (насколько быстро значения меняются в блоке). Результат — матрица коэффициентов 8 × 8. Значение в левом верхнем углу — DC-коэффициент, средняя яркость блока. Остальные 63 — AC-коэффициенты, представляющие детали всё более высокой частоты.
Высокочастотные коэффициенты кодируют мелкую текстуру: волосы, траву, шум. Низкочастотные коэффициенты кодируют крупные формы: небо, стены, тон кожи.
4. Квантование
Здесь происходит потеря. JPEG применяет таблицу квантования к каждому DCT-блоку. Таблица — это вторая матрица делителей 8 × 8. Каждый DCT-коэффициент делится на соответствующий квантователь и округляется до ближайшего целого.
Стандартная таблица квантования бьёт по высокочастотным коэффициентам сильнее всего:
16 11 10 16 24 40 51 61
12 12 14 19 26 58 60 55
14 13 16 24 40 57 69 56
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99
Высокочастотный коэффициент, скажем, 7 делится на 121 и округляется до 0. Он исчез. Необратимо. Декодер никогда его не увидит. Это сжатие с потерями (lossy): данные уничтожаются, а не просто перекодируются.
При качестве 90 квантователи делятся на меньший масштабирующий коэффициент. При качестве 50 масштабирующий коэффициент выше. Больше коэффициентов обнуляется. Файл становится меньше. Изображение — мягче.
5. Энтропийное кодирование (Entropy Coding)
После квантования оставшиеся коэффициенты сканируются зигзагом, кодируются по длине серии (RLE) и сжимаются кодом Хаффмана. Этот этап без потерь (lossless). Он лишь упаковывает уже уничтоженные данные эффективнее.
Результат: несжатое RGB-изображение 12 МП занимает 36 МБ. Сохраните его как JPEG качества 90 с субдискретизацией 4:2:0, и оно сократится до ~3,5 МБ. Это сокращение в 10 раз с видимой потерей качества только при увеличении.
Насколько это сжатие с потерями на самом деле?
Ущерб распределяется неравномерно.
| Качество | Типичный размер (12 МП) | Визуальное воздействие |
|---|---|---|
| 95+ | ~8 МБ | Почти незаметно; предпочтительно для архивирования |
| 90 | ~3,5 МБ | Незначительное смягчение; стандарт для камер |
| 75 | ~1,8 МБ | Заметное размытие мелких деталей; веб-стандарт |
| 50 | ~1,0 МБ | Блочные артефакты очевидны при масштабе 100% |
| 30 | ~600 КБ | Цветовое бандинг, шум москитов, непригодно для печати |
Три отдельных артефакта появляются по мере падения качества:
- Блочность: видимые границы сетки 8 × 8, особенно в плавных градиентах вроде неба.
- Звон (ringing): осциллирующие ореолы вокруг контрастных границ (текст на фоне).
- Цветовое размытие: субдискретизация цветности размазывает цвет через резкие границы.
Настоящий убийца — потеря поколения (generation loss). Откройте JPEG, отредактируйте, сохраните снова как JPEG. Каждое сохранение перезапускает весь конвейер: RGB → YCbCr → субдискретизация → DCT → квантование. Ошибки округления накапливаются. Через 10 поколений изображение может выглядеть так, будто нарисовано акварелью. Через 50 — оно неузнаваемо.
Зелёный сдвиг и другие особенности пересжатия
Пересохраняйте JPEG достаточно много раз, и вы можете заметить уход цветовой температуры. Некоторые изображения приобретают едва заметный зелёный оттенок. Другие сдвигаются в пурпурный. Причина зарыта в цветностных каналах.
JPEG хранит Cb и Cr в пониженном разрешении и агрессивно квантует их. Каждое сохранение вносит ошибку округления в оба канала. Обратное преобразование в RGB использует эту матрицу:
R = Y + 1.402 × (Cr - 128)
G = Y - 0.344136 × (Cb - 128) - 0.714136 × (Cr - 128)
B = Y + 1.772 × (Cb - 128)
Заметьте, зелёный вычисляется и из Cb, и из Cr. Когда повторное квантование сдвигает Cb вверх и Cr вниз хотя бы на один шаг квантования, канал G уходит. Положительное смещение в Cb толкает зелёный вниз. Отрицательное смещение в Cr толкает зелёный вверх. Взаимодействие несимметрично, потому что коэффициенты -0.344136 и -0.714136 имеют разную величину. Результат: медленное накопление зелёного в некоторых областях изображения, особенно там, где исходные значения цветности уже были близки к границам квантования.
Это не гарантированный эффект. Он зависит от таблиц квантования кодировщика, режима субдискретизации и содержимого изображения. Но он реален, воспроизводим, и это одна из причин, по которым профессиональные рабочие процессы избегают пересохранения JPEG.
Если JPEG такой неидеальный, почему его использует всё?
JPEG популярен не потому, что он идеален. Он популярен, потому что достаточно хорош и универсален.
- Нет патентной блокировки: базовый патент JPEG (принадлежавший Forgent Networks) истёк в 2006 году. Формат свободен от роялти.
- Аппаратное декодирование: каждая камера, телефон, принтер и браузер имеет JPEG-декодер на кремнии или в высокооптимизированном C. Рендеринг почти ничего не стоит.
- Достаточно хорош: для социальных сетей, новостных сайтов и почтовых вложений JPEG качества 75 неотличим от исходника на экране телефона.
- Инерция экосистемы: CMS, CDN, библиотеки изображений и унаследованные архивы все говорят на JPEG. Их замена требует не просто лучшего формата. Она требует лучшего формата плюс причину для миграции петабайт существующих активов.
Форматы, которые должны были победить
Несколько форматов пытались свергнуть JPEG. Ни один не добился этого полностью.
| Формат | Lossy | Lossless | Прозрачность | Анимация | Макс. битовая глубина | Ключевое преимущество |
|---|---|---|---|---|---|---|
| JPEG | Да | Нет | Нет | Нет | 8-bit | Универсальная поддержка |
| PNG | Нет | Да | Да | Нет | 16-bit | Идеальное lossless, альфа-канал |
| WebP | Да | Да | Да | Да | 8-bit | На 25–35% меньше JPEG, нативно в браузере |
| HEIC | Да | Да | Да | Да | 16-bit | ~50% меньше JPEG, стандарт Apple |
| AVIF | Да | Да | Да | Да | 12-bit | Лучшее сжатие сегодня, свободно от роялти |
| JPEG XL | Да | Да | Да | Да | 32-bit | Lossless пересжатие JPEG, прогрессивный decode |
PNG решил проблему lossless, но производит файлы в 5–10 раз больше JPEG для фото. Он владеет скриншотами, UI-ассетами и графикой.
WebP (Google, 2010) превосходит JPEG по размеру и добавляет прозрачность и анимацию. Сейчас поставляется в каждом основном браузере. Web Almanac 2025 оценивает WebP в 11% LCP-изображений, против 7% в 2024. Это безопасный путь обновления сегодня.
HEIC (Apple, 2017) использует сжатие HEVC внутри контейнера ISOBMFF. На ~40–50% меньше JPEG и хранит несколько изображений на файл. Доминирует в экосистеме Apple и застопорился везде из-за пулов патентов HEVC.
AVIF (AOM, 2019) происходит из видео AV1. Достигает лучших коэффициентов сжатия из всех широко поддерживаемых форматов — примерно на 30% меньше WebP при эквивалентном качестве. Минус — скорость декодирования. AVIF-изображения могут рендериться в 2–3 раза дольше, чем JPEG на мобильных устройствах, съедая батарею и задерживая Largest Contentful Paint.
JPEG XL (ISO/IEC 18181, 2021) технически превосходит их всех. Сжимает на 50–60% меньше JPEG. Декодирует быстро. Поддерживает прогрессивное декодирование: пригодное изображение появляется после загрузки лишь ~1% файла. Главное — может без потерь пересжимать существующие JPEG для экономии ~20% размера с побитовым восстановлением оригинала. Никакой другой формат этого не умеет.
Где мы сейчас
У JPEG XL было трудное детство. Google добавил экспериментальную поддержку в Chrome в 2021 году, затем удалил её 31 октября 2022 года — «решение на Хэллоуин». Заявленная причина: недостаточный инкрементальный выигрыш над существующими форматами. Реакция была мгновенной. Issue в Chromium стал вторым по количеству звёзд в истории проекта. Google обвинили в защите AVIF, формата, привязанного к Alliance for Open Media, которую Google соосновал.
В конце 2025 года Chromium развернул курс. Новый декодер на Rust (jxl-rs) попал в Chrome Canary. Chrome 145, выпущенный в феврале 2026 года, поставил поддержку JPEG XL за флагом. Safari поддерживает с 2023 года. Firefox Nightly интегрирует тот же Rust-декодер. JPEG XL пока не включён по умолчанию, но он вернулся в кодовую базу.
AVIF, тем временем, — прагматичный выбор для 2026 года. Поддержка в браузерах широкая. Кодировщики улучшаются. Cloudinary и Cloudflare оба отдают AVIF автоматически через согласование заголовка Accept. Медианная страница с AVIF или WebP показывает 81% хороших показателей LCP против 64% для страниц только с JPEG, по данным CoreDash.
Итог
JPEG — это 33-летний компромисс. Он отбрасывает цветовое разрешение, высокочастотную текстуру и числовую точность в обмен на размеры файлов, которые сделали цифровую фотографию жизнеспособной в 1990-х. Артефакты хорошо изучены. Потеря поколения реальна. Зелёный сдвиг происходит.
Тем не менее JPEG сохраняется по той же причине, по которой сохраняется QWERTY: стоимость переключения выше боли от оставления.
Практичный путь вперёд многослоен:
- Храните мастеры высокого качества. Архивируйте оригиналы как PNG, TIFF или JPEG качества 95+. Никогда не редактируйте повторно из веб-экспорта качества 75.
- Динамически отдавайте современные форматы. Используйте CDN или сервис изображений, который согласовывает AVIF, WebP или JPEG XL на основе заголовка
Acceptбраузера. Храните один мастер; пусть edge конвертирует по требованию. - Не перекодируйте JPEG пакетно. Каждое поколение уничтожает данные. Если нужны файлы меньше, перекодируйте из мастера, а не из другого JPEG.
JPEG не умрёт внезапно. Он угаснет так же, как угас GIF: всё ещё поддерживаемый везде, всё ещё открываемый в каждом просмотрщике, но всё чаще превосходимый форматами, которые делают ту же работу с меньшим числом байтов и меньшим числом артефактов. Разница в том, что на этот раз форматы-заменители действительно побеждают.


