Назад
Регресивні JPEG: як ціле відео ховається в одному файлі зображення
SiTech AI Team2 წთ. საკითხავი

Регресивні JPEG: як ціле відео ховається в одному файлі зображення

У блозі показано, як прогресивні скани JPEG можна зчепити так, що один файл зображення перемикається між картинками або відтворює коротке відео під час завантаження. Практичного застосування в цього трюку немає.

Публікація на maurycyz.com показує, як прогресивний режим формату JPEG — та сама особливість, завдяки якій частково завантажене зображення видно як ескіз низької роздільності, а не як обрізаний шматок, — можна перетворити на спосіб зберігати ціле коротке відео або кілька різних картинок в одному файлі.

Як працюють прогресивні скани

Прогресивний JPEG розбиває стиснені дані на низку сканів, кожен зі своїм заголовком. Перший скан містить лише найнижчу (DC) компоненту Фур'є для всіх трьох колірних каналів — цього достатньо, щоб намалювати дуже грубий ескіз зображення. Наступні вісім сканів доповнюють решту: спершу додаткові деталі яскравості, потім повні дані з низькою точністю і, нарешті, останні відсутні біти. Колір зберігається у просторі YCbCr з половинною роздільністю, тому повні дані про кольоровість важать приблизно стільки ж, скільки сама лише яскравість.

Перезапис картинки під час завантаження

Оскільки кожен скан сам оголошує свій спектральний діапазон, можна зібрати JPEG, у якому пізніші скани перезаписують уже намальовані дані. Прийом грубий: треба зліпити кілька JPEG однакової роздільності та вирізати маркери початку зображення, початку кадру й кінця зображення — автор зробив це невеликою програмою на C. На повільному з'єднанні такий файл під час завантаження помітно перетворюється з однієї картинки на іншу. Щоправда, більшість декодерів зупиняються після певної кількості сканів — імовірно, як захист від атак типу бомби декомпресії — і через це наївний підхід обмежується приблизно дев'ятьма кадрами.

Дев'яносто кадрів в одному файлі

Щоб умістити більше кадрів, кожен кадр має бути якомога меншим. Прогресивний скан не може містити одночасно AC-дані (компоненти вище нуля) і DC-дані, а базовий режим зупиняється після першого скану, тож найменший припустимий прогресивний JPEG — це єдиний DC-скан. Оскільки перетворення працює з блоками 16×16, такий кадр не є однотонним: він відтворюється в одній шістнадцятій початкової роздільності. Chrome здається приблизно після дев'яноста таких кадрів, Firefox терплячіший. Кадри повністю відповідають стандарту, і їх створюють інструментом jpegtran, оголосивши файл сканів.

Практичного застосування немає: JPEG не зберігає інформації про час, тому швидкість відтворення цілком залежить від мережевої затримки. Автор зауважує, що техніка годиться переважно для незвичних рікролів, і додає посилання на схожі експерименти — HTML-відео, зібране лише з елементів dialog, та інтерактивний односторінковий застосунок без CSS і JavaScript. Програму для об'єднання кадрів опубліковано поруч із постом.

SSiTech

SiTech — веброзробка з підтримкою AI

Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.