Есть ли хитрость в создании анимированного GIF из телевизионной статики, которая позволит ему быть относительно небольшим?

Заранее извиняюсь, но это не совсем вопрос фотошопа. Скорее, я пытаюсь придумать что-то убедительное, но максимально эффективно использующее сжатие и возможности формата gif для создания наименьшего возможного файла для анимации.

Некоторые ограничения:

  • Это должно быть не менее 20 или 30 кадров. Я пробовал с меньшим количеством (и так как они в значительной степени несжимаемы, 15 кадров это половина размера 30, вообще говоря)
  • Размер должен быть не менее 256х192
  • Это не должен быть цвет, хотя, или даже полная шкала серого. Я видел убедительные кадры всего с 16 серыми
  • У него может быть образец, но не тот, который мгновенно очевиден для человеческого глаза. Если кто-то берет один кадр и через минуту или две может определить шаблон (что делает его сжимаемым?), Это нормально
  • Кадры со 2 по n могут использовать немного альфы, но когда я начал использовать большие горизонтальные полосы альфы, это было сразу заметно для моих глаз. Таким образом, вы не получите кучу RLE с простым читом.
  • Все вышеперечисленное и до сих пор должно хорошо выглядеть при скорости кадров 30-33мс. Нет переменной скорости или полагаться на что-либо значительно быстрее, чем это.

Также приемлемо: apng, который соответствует вышеуказанным ограничениям. Возможно, даже MPEG, если вы можете придумать это (я не знаю, как DCT делает свою магию).

В идеале я мог бы получить что-то в диапазоне 250 Кбайт, но я бы согласился на что-то значительно меньшее, чем 9-мегапиксельное чудовище, которое я приготовил на прошлой неделе.

О, и еще одно: очевидно, я не ожидаю, что кто-нибудь предоставит для меня графику. Я просто ищу какой-то трюк (-ы), который позволит мне в конце концов добраться туда сам

4 ответа

Решение

Хорошо старый, но все еще без ответа ответ (не проверенный в любом случае)

  1. поэтому создайте данные изображения NoSignal

    Если это не очевидно, как читать это:

  2. закодировать в gif

    Я немного поиграл, поэтому я использовал разрешение 320x240 самое низкое разрешенное значение 3 bit за пиксель. Нижняя не выглядит хорошо. Только единственная глобальная палитра (очевидная) здесь 300KB пример

    NoSignal 320x240x3

[Заметки]

если это только для какого-то приложения, то сгенерируйте изображение на ходу, на самом деле всего несколько строк кода.

Это очень интересный вопрос.

Статический (случайный шум) по своей природе на самом деле очень несжимаемый. Теория информации говорит, что истинный шум в основном несжимаемый, и чем больше шаблонов содержит что-либо, тем более сжимаемым он становится (до такой степени, что сплошная линия из 1 или 0 является полностью сжимаемой.

Идеальным было бы создать настоящий генератор шума (только случайные числа), но это не поможет в рамках вашей проблемы.

Лучшее, что я могу придумать, - это хранить несколько маленьких статических плиток и отображать их в шахматном порядке, чтобы не привлекать внимание к любым узорам. Кроме того, вам не повезет, если вы сожмете это больше 256 x 192 x 20 / 2 или около 500 килобайт (при условии 20 кадров с разрешением 256 x 192 при использовании 4-битной глубины цвета).

Простое кодирование анимированного GIF в 16-цветном режиме должно привести вас к этому.

Да, этого можно добиться с помощью сжатия GIF с потерями или, точнее, специально настроенного компрессора, который выводит шумовой поток LZW.

В лучшем случае для сжатия LZW нужно вывести X пикселей, затем X+1 пикселей, затем X+2 пикселей и т. Д. Это легко сделать с шумом.

Попробуйте испортить gfc_lookup Функция (почти) всегда возвращает самый длинный элемент словаря и сжимает серию зашумленных кадров:

https://github.com/pornel/giflossy/blob/master/src/gifwrite.c#L270

Не легко нормально. Хорошая случайность (высокая энтропия) по определению плохо сжимается. Наличие оттенков серого может помочь, но не сильно.

Если вы хотите сделать это на веб-странице и у вас есть (некоторые) элементы управления, вы всегда можете написать очень маленький кусочек JS, чтобы помочь... если вы можете сделать это, то вы можете сделать следующее:

  1. Создайте gif примерно в 1,5 раза больше нужного вам размера с высокой энтропийной статикой.
  2. Установите обрезку на нужный размер.
  3. Затем вы случайным образом перемещаете его, изменяя начальное смещение.

Пока ваши смещения находятся на приличном расстоянии друг от друга (и не повторяют паттерны), обычно трудно определить их как движение, и они действительно выглядят как статичные.

Я проделал этот трюк около 20 лет назад на Amiga для эмуляции статики в демо с ограниченным объемом памяти, и он работал замечательно хорошо... он также не требует быстрого низкоуровневого кода, как все было сделано путем изменения смещений и сопутствующих процессор побитч остальное.

Другие вопросы по тегам