Dlaczego gif, który stworzyłem, jest taki wolny?

33

Korzystam z ImageMagick, aby zmienić kolekcję pngs w pojedynczy gif. Chcę, aby ten gif był zapętlony tak szybko, jak to możliwe.

To mniej więcej wynik, którego oczekuję (dzięki Wikipedii ):

oczekiwany wynik

To jest wynik, który faktycznie otrzymuję:

rzeczywista wydajność

W mojej przeglądarce (Firefox 17) oczekiwany gif działa ponad dwukrotnie szybciej niż rzeczywisty gif. To mnie zaskakuje, ponieważ określiłem, że każda ramka powinna mieć 0 opóźnienie.

Najpierw stworzyłem 36 pngów, eksplodując gif pożyczony z Wikipedii:

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

Potem coalescerekombinowałem pngs w jeden gif.

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

identify potwierdza, że ​​każda ramka nie ma opóźnienia:

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,

Jest to w rzeczywistości mniejsze opóźnienie niż oryginał:

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,

Rzeczywisty gif ma mniejsze opóźnienie niż oczekiwany gif. Dlaczego oczekiwany gif jest dwa razy szybszy niż rzeczywisty gif?

Kevin
źródło
1
Z ciekawości, co się stanie, jeśli ustawisz opóźnienie na 1 zamiast na 0?
mgilson
1
wygląda na problem z liczbą klatek na sekundę.
SnakeDoc
@mgilson, właśnie tego spróbowałem. Obraz z opóźnieniem 0 i obraz z opóźnieniem 1 wydają się być idealnie zsynchronizowane. Co jest dziwne, ponieważ obraz z 1 opóźnieniem powinien pozostawać w tyle w stosunku 36/100 sekundy na każdą pętlę.
Kevin
1
tl; dr na to pytanie: Użyj-delay 2 .
Matt M.

Odpowiedzi:

17

Eksperymentowałem i stworzyłem wersję 10ms (opóźnienie = 1).

Przykład opóźnienia 10ms

Wydaje się, że programy, które renderują gify, zwykle nie honorują setnych sekundy opóźnień. Zamiast tego używają wartości znacznie większej niż wybrana niewielka wartość.

Nie mogę naprawdę komentować powodów, dla których to robią. Znalazłem więcej niż jeden powód i możliwe, że to wszystko spekulacje.

Ogólnie polecam, aby we wszystkich przypadkach użyć opóźnienia wynoszącego co najmniej dwieście sekund.

Źródła (które pokazują, jak wydaje się, że istnieje wiele powodów. Niektóre są stosunkowo stare):

David Mah
źródło
1
Jeśli program do renderowania spowalnia wszystkie gify, które są zbyt szybkie, gif Wikipedii byłby tak samo wolny jak mój własny gif. Ale tak nie jest. Dlaczego Wikipedia może przekroczyć ograniczenie prędkości, a ja nie?
Kevin
2
@Kevin: Spowalnia wszystkie pliki GIF, które są zbyt szybkie. Twoje pliki GIF są zbyt szybkie. GIF-y Wikipedii nie są zbyt szybkie. Musisz zwolnić, abyś nie był „zbyt szybki”.
David Schwartz
Opóźnienia ramki dla gif Wikipedii wynoszą od 20 ms do 50 ms. Jeśli ustawię własne opóźnienie klatki na 20 ms, jest ono nadal wolniejsze, nawet jeśli teoretycznie spełnia te same „niezbyt szybkie” kryteria, co gif z Wikipedii.
Kevin
2
Jeśli oprócz obrazu wikipedii z opóźnieniami 20 ms, dołączasz gif, który utworzyłeś również z opóźnieniami 20 ms, przyjrzę się.
David Mah
2
Myliłem się. Do 20 ms gif stworzyłem rzeczywiście jest tak szybki jak gif Wikipedia.
Kevin
18

Wygląda na to, że @DavidMah ma rację. W moim systemie Linux minimalne opóźnienie wynosi 0,5:

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

wprowadź opis zdjęcia tutaj

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

wprowadź opis zdjęcia tutaj

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

wprowadź opis zdjęcia tutaj

Z jakiegoś powodu obrazy wydają się nieprawidłowo wyświetlane w mojej przeglądarce. Korzystając z lokalnej przeglądarki zdjęć ( eom), pierwszy obraz jest tak wolny jak ten w pierwotnym pytaniu, a oba pozostałe są szybsze niż wikipedia. I tak piszę na wypadek, gdyby był to problem specyficzny dla mojej przeglądarki. W każdym razie powinieneś uzyskać lepszą prędkość, jeśli wypróbujesz powyższe polecenia.


AKTUALIZACJA: Wydaje się, że występują 2 problemy. Przeglądarki (przynajmniej Firefox i Chrome działające w systemie Linux) nie mogą wyświetlać gifów utworzonych z opóźnieniem <1,5. 1,5 działa dobrze, 1,4 działa wolno. Moja przeglądarka zdjęć radzi sobie z opóźnieniami 0,5 i wyższymi. Spróbuj pobrać jeden z powyższych obrazów i otwórz go w swojej ulubionej przeglądarce zdjęć. Zobacz także:

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

wprowadź opis zdjęcia tutaj

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

wprowadź opis zdjęcia tutaj

AKTUALIZACJA2: @DavidMah wskazuje w komentarzach poniżej, że wartości dziesiętne są zaokrąglane do najbliższej liczby całkowitej. Tak więc 1,4 jest zaokrąglane do 1, co jest zbyt wolne, podczas gdy 1,5 jest zaokrąglane do 2, co jest OK.

terdon
źródło
7
Uwaga na próby przypisania opóźnień wartościom dziesiętnym. Opóźnienie jest przechowywane w dwóch bajtach (implikacja tego jest taka, że ​​największe opóźnienie ramki wynosi 655360 ms) i jest liczbą całkowitą bez znaku. Konwertuj zaokrągla twoje wartości do najbliższej liczby całkowitej. en.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_GIF
David Mah
3
@DavidMah ah, to ma sens. Więc 1,5 działa, ponieważ jest zaokrąglone do 2, a 1.4 nie, ponieważ jest zaokrąglone do 1.
terdon
6

Odniosłem większy sukces, używając XxYnotacji opóźniającej, zasadniczo xjest to jak a /, więc jeśli określisz -delay 1x20, ramka jest wyświetlana przez 1/20 sekundy.

kralyk
źródło