В прогрессивных JPEG есть фишка: можно сначала сохранять низкочастотные компоненты. Частично загруженное изображение показывается в низком разрешении, а не обрезанным. Данные разбиты на «сканы», каждый со своим заголовком. Первый скан содержит DC-бин (нулевая частота) для всех трёх цветовых каналов YCbCr — яркость и два цветоразностных. Потом идут ещё девять сканов, которые постепенно добавляют детали и повышают точность: сначала половина, потом четверть, затем полные данные. Так как каждый скан явно задаёт свой спектральный диапазон, можно сконструировать JPEG, где новые сканы перезаписывают уже отрисованное. Это делается просто: взять несколько изображений одинакового разрешения, сцепить их, удалив маркеры начала/конца. Получится файл, который при медленной загрузке переключается между картинками — по сути, анимация. Но большинство декодеров сдаются после определённого числа сканов (чтобы избежать zip-бомбы). В Chrome можно добиться примерно 90 кадров, Firefox терпит больше. Для полноценной анимации нужно минимизировать число сканов в каждом кадре. Базовый JPEG имеет только один скан, но он не подходит: в прогрессивном режиме скан не может содержать и DC, и AC одновременно; AC обязан следовать за DC, поэтому минимальный прогрессивный JPEG — это лишь один скан, содержащий только DC. Такое изображение получается 1/16 исходного разрешения, но зато полностью стандартно. Используя утилиту jpegtran, можно собрать файл из таких DC-only скан-кадров — и получить целое видео внутри одной картинки. Практического применения нет: нет встроенной синхронизации по времени, всё зависит от задержки сети. Но много веселья: вот пример pure HTML видео с использованием <dialog> — badapple.rose.systems. Нет правила, что данные должны быть жёстко закодированы: существует интерактивное одностраничное приложение без CSS или JavaScript, использующее ту же технику.
Прогрессивные JPEG оживают: анимация из DC-only сканов через jpegtran
18.07.2026 03:14 · hackernews