Регрессивные JPEG: когда разработчик обращает алгоритм вспять, чтобы создавать изображения, которые регрессируют

Разработка & Кодинг Jul 18, 2026В закладки

Регрессивные JPEG: когда разработчик обращает алгоритм вспять, чтобы создавать изображения, которые регрессируют
Иллюстрация : Momiji Shirogane

Любитель опубликовал обратное исследование кодека JPEG: генерация изображений, которые при декодировании создают преднамеренные артефакты, манипулируя квантованием DCT. Интересно, поучительно и отличное упражнение для понимания формата.

Проект

На главной странице Hacker News на этой неделе статья под названием « Regressive JPEGs » (maurycyz.com/projects/bad_jpeg/) привлекла наше внимание. Её автор документирует обратное исследование кодека JPEG: вместо оптимизации изображения по размеру и качеству, он генерирует специально деградированные JPEG, манипулируя таблицами квантования и блоками DCT (Discrete Cosine Transform).

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

Напоминание: как JPEG кодирует

JPEG (Joint Photographic Experts Group, стандарт ISO/IEC 10918-1 от 1992 года) следует классическому конвейеру:

  1. Конвертация RGB → YCbCr — разделяет яркость и цветность
  2. Прореживание цветности (часто 4:2:0)
  3. Разбиение на блоки 8×8
  4. DCT — преобразует каждый блок из пространственной области в частотную
  5. Квантование — делит коэффициенты DCT на таблицу квантования (настоящий рычаг сжатия)
  6. Zig-zag scan + Huffman — кодирует коэффициенты в бинарный поток

Качество восприятия зависит в основном от шага 5: чем агрессивнее таблица квантования, тем больше теряется деталей в высоких частотах.

Что делает « Regressive JPEGs »

Автор извращает этот механизм. Создавая экзотические таблицы квантования (очень высокие значения на некоторых частотах, аномально низкие — на других), он производит JPEG, которые при чтении стандартным декодером демонстрируют:

  • Видимые блоки 8×8 (экстремальные артефакты блокировки)
  • Паттерны ringing (осцилляции вокруг контуров)
  • «Расплывающиеся» цвета из-за сильного прореживания хромы
  • А то и вовсе не узнаваемые изображения после декодирования

Педагогическая ценность очевидна: мы видим невооружённым глазом, какой вклад вносит каждый параметр кодека в сохранение деталей.

Серьёзные применения?

Помимо удовольствия от любопытства, есть несколько легитимных применений:

  1. Тестирование устойчивости декодеров — настоящий декодер JPEG должен обрабатывать некорректные файлы без краша. Генерация специально «плохих» JPEG — это ручное fuzz-тестирование.
  2. Водяные знаки / стеганография — глубокое понимание квантования помогает прятать информацию в коэффициентах DCT (техника, используемая в F5, OutGuess).
  3. Понимание артефактов в ML — модели супер-разрешения, обученные на JPEG, должны научиться отличать контент от артефактов. Датасет «плохих JPEG» полезен.

В сухом остатке, такие проекты показывают, что формат, который мы считаем чёрным ящиком, всегда скрывает рычаги для эксплуатации — на благо или ради чистого любопытства.

Копаем глубже

Оригинальная спецификация JPEG (ITU T.81 / ISO 10918-1) многословна, но читабельна — и это лучший входной пункт, чтобы понять, что именно видит декодер. Со стороны инструментария, libjpeg-turbo (Darrell Commander) позволяет инспектировать таблицы квантования файла через djpeg -verbose — отличный способ проверить, что кодек сохранил в конкретном JPEG.

На заметку: форматы файлов — не чёрные ящики. Чтение спецификации (JPEG, PNG, WebP) превращает любого разработчика в более осведомлённого пользователя инструментов обработки изображений, которые он использует каждый день.

Resources

Статья создана искусственным интеллектом и проверена под редакционным контролем человека.

Наша редакция
Была ли статья полезной?

10 чел. оценили эту статью

Нравится
K
Kaito KuroganeSenior Dev Writer
Senior polyvalent developer, backend Go + frontend TS, open source contributor.
Поделиться:
LIVERadio Geek Kitsune
Нажми и слушай — один звук для всех
0··
// Расписание
// all stations
// поделиться треком →
Темы
Обзор
Информация