Чому 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. То чому ж очікуваний gif у два рази швидший, ніж власний GIF?


1
Що з цікавості, що станеться, якщо встановити затримку на 1, а не на 0?
mgilson

1
виглядає як частота кадрів.
SnakeDoc

@mgilson, я щойно це спробував. Зображення 0-затримки та зображення 1-затримки здаються ідеально синхронізованими. Що дивно, оскільки зображення з 1 затримкою повинно відставати на 36/100-ту секунди кожного циклу.
Кевін

1
tl; dr з цього питання: Використовуйте-delay 2 .
Метт М.

Відповіді:


17

Я експериментував і створив версію 10 мс (затримка = 1).

Приклад затримки 10 мс

Схоже, що програми, які надають gif, як правило, не враховують ставки затримки на 0 сотих секунд. Натомість вони використовують значення, яке набагато більше, ніж мале значення, яке ви вибрали.

Я не можу по-справжньому коментувати причини, чому вони роблять це. Я натрапив на не одну причину, і цілком можливо, що це все міркування.

Загалом, я б рекомендував вам використовувати затримку принаймні на дві сотні секунди у всіх випадках.

Джерела (які демонструють, як це здається, є кілька причин. Деякі відносно старі):


1
Якщо програма візуалізації сповільнює всі занадто швидкі gif-файли, то gif у Вікіпедії буде такою ж повільною, як і моя власна GIF. Але це не так. Чому Вікіпедія може порушити обмеження швидкості, а я не можу?
Кевін

2
@Kevin: Це сповільнює надто швидкі GIF-файли. Ваші GIF-файли занадто швидкі. GIF у Вікіпедії не надто швидкі. Вам потрібно гальмувати, щоб ви не були «надто швидкими».
Девід Шварц

Затримка кадру для gif у Вікіпедії становить від 20 мс до 50 мс. Якщо я встановив власну затримку кадру в 20 мс, вона все ще повільніше, хоча теоретично вона відповідає тим же "не надто швидким" критеріям, що і gif у Вікіпедії.
Кевін

2
Якщо поряд із зображенням у вікіпедії із затримкою 20 мс, ви додасте gif, який ви створили також із затримкою 20 мс, я погляну.
Девід Мах

2
Я помилився. У 20 мс GIF я створив дійсно так швидко , як GIF Вікіпедії.
Кевін

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-е зображення настільки ж повільне, як і в оригінальному питанні, а обидва інші - швидше, ніж у вікіпедії. Я все-таки публікую повідомлення, якщо це проблема, специфічна для мого браузера. У будь-якому випадку, ви повинні отримати кращі швидкості, якщо ви спробуєте команди, розміщені вище.


ОНОВЛЕННЯ: Здається, є дві проблеми. Веб-переглядачі (принаймні y firefox та хром, що працюють на 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, що в порядку.


7
Обережно намагайтеся призначити затримки десятковим значенням. Затримка зберігається у двох байтах (наслідки цього полягають у тому, що найбільша затримка кадру становить 655360 мс) і є цілим числом без підпису. Конвертувати - це округлення значень до найближчого цілого числа. en.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_GIF
David Mah

3
@DavidMah ах, це має сенс. Так 1.5 працює, тому що він округлюється до 2, а 1,4 - не, тому що округлюється до 1.
тердон

6

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.