Сжатие JPEG: урок информатики для школьников с расчётами
💻 Информатика · 10 класс
Как фотография становится JPEG: цветовые компоненты, 4:2:0, блоки 8×8, ДКП и квантование. Расчёты объёма, потери качества и пять задач с ответами.

JPEG-сжатие с потерями уменьшает объём изображения, отбрасывая часть исходной информации. В школьном проекте это удобно для фотографий: файл легче отправить или вставить в презентацию, но мелкие детали могут измениться. Ниже разберём распространённый 8-битный режим на основе ДКП и кодирования Хаффмана. Семейство JPEG 1 (ISO/IEC 10918, ITU-T T.81), появившееся в 1992 году, включает и другие режимы, в том числе без потерь; свойства одного режима нельзя переносить на всё семейство.
Конвейер JPEG: семь шагов
1. Цветовое пространство. В распространённой схеме входные RGB-данные переводят в YCbCr: Y — яркостная компонента, Cb и Cr — цветоразностные. Это типичная схема, а не обязательное цветовое пространство любого JPEG: например, возможны RGB и оттенки серого. Глаз человека заметно лучше различает детали яркости, чем цветовые переходы, — этим воспользуемся на следующем шаге.
2. Субдискретизация цвета. Для каждого блока 2×2 пикселя яркость Y хранится для всех четырёх, а цветные Cb и Cr — один раз на блок. В схеме 4:2:0 каждая цветоразностная компонента имеет вчетверо меньше отсчётов, чем Y. Для области 2×2 вместо 12 отсчётов схемы 4:4:4 остаётся 6: четыре Y и по одному Cb и Cr. Общее количество отсчётов уменьшается вдвое, но это ещё не размер готового файла. Прореживание может быть заметно на мелких цветных буквах и границах; оно применяется не всегда.
3. Блоки 8×8 и сдвиг уровней. Отсчёты каждой компоненты группируют в блоки 8×8, значения сдвигаются из диапазона 0–255 в −128…+127.
4. Дискретно-косинусное преобразование (ДКП). Каждый блок 8×8 переводится в частотную область: получается матрица 64 коэффициента. Верхний левый, DC, пропорционален среднему уровню отсчётов блока после сдвига; для цветоразностных компонент это не яркость, остальные описывают постепенно более мелкие детали. Для плавных участков фото высокочастотные коэффициенты близки к нулю.
5. Квантование — здесь теряются данные. Каждый коэффициент делится на шаг квантования из таблицы и округляется. Более крупные шаги обычно дают более грубое восстановление и меньший файл, но точный размер зависит от содержимого и настроек кодировщика. В следующем учебном примере округляем к ближайшему целому, а при равном расстоянии — от нуля. Пример 1. Коэффициенты [140, −13, 8, 3] с шагами [16, 8, 4, 2] округляются до [9, −2, 2, 2]; при обратном квантовании получится [144, −16, 8, 4] — погрешности [4, 3, 0, 1] не превышают половины шага. Это округление необратимо: именно оно делает JPEG «с потерями».
6. Зигзаг и RLE. AC-коэффициенты обходят в зигзагообразном порядке. Кодируется число нулей перед следующим ненулевым коэффициентом и категория величины этого коэффициента, а его значение дополняется битами. Для длинных серий нулей и конца блока есть специальные обозначения. DC кодируют отдельно как разность с предыдущим DC той же компоненты. Это точнее, чем представлять весь поток просто парами «пропуск, значение».
7. Энтропийное кодирование. Полученные символы кодируют по таблицам Хаффмана; сами амплитуды также требуют дополнительных битов. Общий принцип переменной длины кода покажем на отдельном учебном алфавите, который не является реальной таблицей JPEG. Пример 2. Для трёх символов с вероятностями {A: 1/2, B: 1/4, C: 1/4} средняя длина кода равна энтропии распределения: 1.5 бита вместо 2 бит у фиксированного кода — выигрыш 25%. В обычном самостоятельном JPEG-файле передаются необходимые таблицы квантования и Хаффмана. В специальных сокращённых потоках таблицы могут передаваться отдельно.
Сколько весит фотография: расчёт
Снимок 4000×3000 в несжатом RGB занимает 4000·3000·3 = 36 000 000 байт ≈ 34,3 МиБ. Для 8-битных компонент после прореживания 4:2:0 получается 18 000 000 байт отсчётов до дальнейшего кодирования, без учёта служебных данных. Определить размер итогового JPEG только по разрешению нельзя: важны детали, шум, таблицы квантования и другие настройки. Для условного результата 3,6 МБ коэффициент сжатия равен 36 / 3,6 = 10. Это пример расчёта, а не обещание размера. Более высокая настройка качества обычно уменьшает потери при новом кодировании, но уже удалённые детали не восстанавливает.
Что лежит внутри .jpg
По справке Библиотеки Конгресса JPEG-поток — цепочка сегментов-маркеров: файл начинается с маркера SOI (байты FF D8), он может содержать APP0/JFIF или APP1/Exif, таблицы квантования и маркер кадра SOF. Наличие именно APP0 или APP1 не обязательно для любого JPEG-потока. Маркер 0xFFC0 означает базовый (baseline) режим ДКП, 0xFFC2 — прогрессивный JPEG, в котором коэффициенты передаются по нескольким проходам и файл можно отображать постепенно, с нарастающей детализацией.
Почему у JPEG артефакты
Главный источник потерь в рассматриваемом режиме — квантование; потери также может вносить прореживание цвета. Идеальное ДКП обратимо, а в численной реализации возможно округление. Кодирование Хаффмана не отбрасывает уже полученные символы. Крупные шаги стирают мелкие детали, поэтому на резких границах (текст, края предметов, небо с плавными градиентами) появляются блоки 8×8 и ореолы. Если изображение декодировать, отредактировать и снова закодировать с потерями, могут добавиться новые искажения. Простое копирование файла этого не делает; существуют и преобразования JPEG без повторного квантования. Для работы полезно хранить исходник или мастер-файл без новых потерь, а JPEG экспортировать для нужной задачи. Практические нюансы экспорта разбирает наш урок по экспорту из GIMP в PNG и JPEG.
У стандарта есть и режимы без потерь: lossless-режим JPEG 1 (маркер SOF3) и отдельный стандарт JPEG-LS (ISO/IEC 14495-1 | ITU-T T.87), который предусматривает сжатие без потерь и с ограниченными потерями. Эти режимы нельзя отождествлять с установкой «качество 100» у обычного ДКП-кодировщика.
Упражнения
Задание 1
Сколько байт занимает несжатое изображение 1920×1080 в формате RGB?
Ответ 1: 1920·1080·3 = 6 220 800 байт ≈ 5,93 МиБ.
Задание 2
Какой шаг квантования грубее: для коэффициента 140 с шагом 16 или для коэффициента 8 с шагом 4, и где абсолютная погрешность округления больше?
Ответ 2: шаг 16 грубее шага 4. В данных числах 140 превращается в 144 с абсолютной ошибкой 4, а 8 восстанавливается точно с ошибкой 0. Верхние границы ошибки при таком округлении — 8 и 2 соответственно; это границы, а не фактические ошибки примеров.
Задание 3
Почему цветную компоненту Cb можно хранить в четыре раза меньше отсчётов, чем яркость Y?
Ответ 3: человеческий глаз хуже различает цветовую детализацию, чем яркостную; поэтому такое уменьшение цветовой детализации часто приемлемо для фотографий, но на некоторых изображениях заметно. Вдвое уменьшается общее число отсчётов трёх компонент относительно 4:4:4, а число отсчётов самой Cb — вчетверо.
Задание 4
Фото занимает 36 МБ без сжатия и 3,6 МБ после JPEG. Чему равен коэффициент сжатия?
Ответ 4: 10:1 (36 / 3,6 = 10). Это результат условий задачи; универсального коэффициента для высокого качества нет.
Задание 5
Почему нельзя «улучшить» качество уже сохранённого JPEG, пересохранив его с качеством 100%?
Ответ 5: информация, удалённая квантованием, необратимо потеряна; установка качества 100 не вернёт удалённые детали и не гарантирует отсутствие новых потерь при перекодировании. Например, кодировщик может сохранять прореживание цвета; остаются и численные округления. Значение ползунка качества зависит от программы.