Почему GIF, который я создал, так медленно?

33

Я использую ImageMagick, чтобы превратить коллекцию PNG в один GIF. Я хочу, чтобы этот GIF зациклился как можно быстрее.

Это примерно то, что я ожидаю (любезно предоставлено Википедией ):

ожидаемый результат

Это вывод, который я на самом деле получаю:

фактический объем производства

В моем браузере (Firefox 17) ожидаемый gif работает более чем в два раза быстрее, чем фактический gif. Это удивляет меня, потому что я указал, что каждый кадр должен иметь 0 задержек.

Сначала я создал 36 png, взорвав gif, заимствованный из Википедии:

--caution: command generates 36 pngs
convert.exe newton.gif newton_%d.png

Затем я использовал coalesceрекомбинацию PNG в один GIF.

convert.exe -dispose none -delay 0 newton_%d.png[0-35] -coalesce output.gif

identify подтверждает, что каждый кадр не имеет задержки:

identify.exe -format "%T, " output.gif
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

Это на самом деле меньше задержки, чем оригинал:

identify.exe -format "%T, " newton.gif
5, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2,

Фактический GIF имеет меньшую задержку, чем ожидаемый GIF. Так почему же ожидаемый гиф в два раза быстрее, чем реальный гиф?

Kevin
источник
1
Из любопытства, что произойдет, если вы установите задержку 1, а не 0?
Мгилсон
1
выглядит как проблема с частотой кадров.
SnakeDoc
@mgilson, я только что попробовал это. Изображение с 0 задержками и изображение с 1 задержкой выглядят идеально синхронизированными. Что странно, так как изображение с 1 задержкой должно отставать от 36 / сотых секунды в каждом цикле.
Кевин
1
tl; dr по этому вопросу: используйте-delay 2 .
Мэтт М.

Ответы:

17

Я экспериментировал и создал версию 10 мс (задержка = 1).

Пример задержки 10 мс

Кажется, что программы, которые рендерит гифки, как правило, не учитывают частоту задержки в 0 сотых секунды. Вместо этого они используют значение, которое намного больше, чем небольшое значение, которое вы выбрали.

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

В целом, я бы рекомендовал использовать задержку не менее двух сотен секунд во всех случаях.

Источники (которые демонстрируют, как на это может быть несколько причин. Некоторые из них относительно старые):

Дэвид Мах
источник
1
Если программа рендеринга замедляет все слишком быстрые гифки, то гифка из Википедии будет такой же медленной, как и мой собственный гиф. Но это не так. Почему Википедия может нарушить ограничение скорости, а я нет?
Кевин
2
@Kevin: Это замедляет все GIF-файлы, которые слишком быстро. Твои гифки слишком быстрые. GIF-файлы Википедии не слишком быстрые. Вам нужно замедлить, чтобы не быть "слишком быстрым".
Дэвид Шварц
Задержка кадра для GIF-файла Википедии составляет от 20 до 50 мс. Если я установлю собственную задержку кадра на 20 мс, она все равно будет медленнее, хотя теоретически она соответствует тем же критериям «не слишком быстро», что и рисунок из Википедии.
Кевин
2
Если наряду с изображением из Википедии с задержкой 20 мс, вы добавите созданный вами рисунок с задержкой 20 мс, я посмотрю.
Дэвид Мах
2
Я ошибался. Созданный мною гиф в 20 мс действительно такой же быстрый, как и гифка из Википедии.
Кевин
18

Похоже, @DavidMah прав. В моей системе Linux минимальная задержка составляет 0,5:

convert -dispose none -delay 0.4 newton_%d.png[0-35] -coalesce output0.4.gif

введите описание изображения здесь

convert -dispose none -delay 0.5 newton_%d.png[0-35] -coalesce output0.5.gif

введите описание изображения здесь

convert -dispose none -delay 1 newton_%d.png[0-35] -coalesce output1.gif

введите описание изображения здесь

По некоторым причинам изображения не отображаются должным образом в моем браузере. Используя локальную программу просмотра изображений ( eom), 1-е изображение работает медленнее, чем в оригинальном вопросе, а оба других быстрее, чем в Википедии. Я пишу в любом случае, если это проблема, специфичная для моего браузера. В любом случае, вы должны получить лучшую скорость, если вы попробуете команды, опубликованные выше.


ОБНОВЛЕНИЕ: Кажется, есть 2 проблемы. Браузеры (по крайней мере, у Firefox и Chromium работают в Linux) не могут отображать GIF-файлы, созданные с задержкой <1,5. 1.5 работает отлично, 1.4 медленно. Мой просмотрщик изображений может работать с задержками от 0,5 и выше. Попробуйте загрузить одно из приведенных выше изображений и открыть его в своем любимом просмотрщике изображений. Также взгляните на это:

convert -dispose none -delay 1.4 newton_%d.png[0-35] -coalesce output1.4.gif

введите описание изображения здесь

convert -dispose none -delay 1.5 newton_%d.png[0-35] -coalesce output1.5.gif

введите описание изображения здесь

UPDATE2: @DavidMah указывает в комментариях ниже, что десятичные значения округляются до ближайшего целого числа. Итак, 1.4 округляется до 1, что слишком медленно, а 1,5 округляется до 2, что нормально.

terdon
источник
7
Будьте осторожны, пытаясь назначить задержки десятичным значениям. Задержка хранится в двух байтах (это означает, что наибольшая задержка кадра составляет 655360 мс) и представляет собой целое число без знака. Конвертировать округляет ваши значения до ближайшего целого числа. en.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_GIF
Дэвид Мах,
3
@DavidMah ах, это имеет смысл. Таким образом, 1,5 работает, потому что округляется до 2, а 1,4 нет, потому что округляется до 1.
terdon
6

Я добился большего успеха, используя XxYобозначение задержки, по сути, xэто как a /, поэтому, если вы укажете -delay 1x20, кадр будет отображаться в течение 1/20 секунды.

kralyk
источник