Mengapa gif yang saya buat sangat lambat?

33

Saya menggunakan ImageMagick untuk mengubah koleksi png menjadi gif tunggal. Saya ingin gif ini berputar secepat mungkin.

Ini kira-kira hasil yang saya harapkan (milik Wikipedia ):

output yang diharapkan

Ini adalah output yang saya dapatkan:

hasil aktual

Di browser saya (Firefox 17), gif yang diharapkan berjalan dua kali lebih cepat dari gif yang sebenarnya. Ini mengejutkan saya, karena saya menetapkan bahwa setiap frame harus memiliki 0 penundaan.

Pertama saya membuat 36 pngs dengan meledakkan gif yang dipinjam dari Wikipedia:

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

Kemudian saya biasa coalescemenggabungkan png menjadi satu gif.

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

identify menegaskan bahwa setiap frame tidak memiliki penundaan:

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,

Ini, pada kenyataannya, lebih sedikit keterlambatan dari aslinya:

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 aktual memiliki lebih sedikit waktu tunda daripada gif yang diharapkan. Jadi mengapa gif yang diharapkan dua kali lebih cepat dari gif yang sebenarnya?

Kevin
sumber
1
Karena penasaran, apa yang terjadi jika Anda menetapkan penundaan ke 1 daripada 0?
mgilson
1
sepertinya masalah frame-rate.
SnakeDoc
@ Mcgson, saya baru saja mencobanya. Gambar 0-delay dan gambar 1-delay tampaknya disinkronkan dengan sempurna. Yang aneh, karena gambar 1-delay harus tertinggal 36/100 detik setiap loop.
Kevin
1
tl; dr pada pertanyaan ini: Gunakan-delay 2 .
Matt M.

Jawaban:

17

Saya bereksperimen dan membuat versi 10ms (delay = 1).

Contoh 10ms keterlambatan

Tampaknya program-program yang membuat gif cenderung untuk tidak menghormati tingkat keseratus detik dari seratus detik. Sebaliknya, mereka menggunakan nilai yang jauh lebih besar daripada nilai kecil yang Anda pilih.

Saya tidak bisa mengomentari alasan mengapa mereka melakukan ini. Saya telah menemukan lebih dari satu alasan, dan mungkin saja itu semua spekulasi.

Secara umum, saya akan merekomendasikan Anda menggunakan penundaan setidaknya dua ratus detik dalam semua kasus.

Sumber (yang menunjukkan bagaimana ada beberapa alasan untuk ini. Beberapa relatif tua):

David Mah
sumber
1
Jika program rendering memperlambat semua gif yang terlalu cepat, maka gif Wikipedia akan sama lambatnya dengan gif saya sendiri. Tapi ternyata tidak. Mengapa Wikipedia dapat mematahkan batas kecepatan, dan saya tidak bisa?
Kevin
2
@Kevin: Ini memperlambat semua GIF yang terlalu cepat. GIF Anda terlalu cepat. GIF Wikipedia tidak terlalu cepat. Anda perlu memperlambat agar Anda tidak "terlalu cepat".
David Schwartz
Frame tertunda untuk kisaran gif Wikipedia antara 20 ms dan 50 ms. Jika saya mengatur penundaan frame saya ke 20 ms, itu masih lebih lambat, meskipun secara teoritis itu memenuhi kriteria "tidak terlalu cepat" seperti gif Wikipedia.
Kevin
2
Jika, di samping gambar wikipedia yang memiliki keterlambatan 20ms, Anda menyertakan gif yang telah Anda buat juga dengan keterlambatan 20ms, saya akan melihatnya.
David Mah
2
Saya salah. The 20 ms gif saya buat memang secepat gif Wikipedia.
Kevin
18

Sepertinya @DavidMah benar. Di sistem Linux saya, penundaan minimum adalah 0,5:

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

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

Untuk beberapa alasan, gambar tampaknya tidak ditampilkan dengan benar di browser saya. Menggunakan penampil gambar lokal ( eom), gambar 1 lambat seperti yang ada di pertanyaan asli dan yang lain lebih cepat dari wikipedia. Saya tetap memposting kalau-kalau itu masalah khusus untuk browser saya. Bagaimanapun, Anda harus mendapatkan kecepatan yang lebih baik jika Anda mencoba perintah yang diposting di atas.


UPDATE: Tampaknya ada 2 masalah. Browser (setidaknya y firefox dan chromium yang berjalan di Linux) tidak dapat menampilkan gif yang dibuat dengan penundaan <1.5. 1,5 berfungsi dengan baik, 1,4 lambat. Penampil gambar saya dapat mengatasi keterlambatan 0,5 ke atas. Coba unduh salah satu gambar di atas dan buka di penampil gambar favorit Anda. Lihat juga ini:

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

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

UPDATE2: @DavidMah menunjukkan dalam komentar di bawah ini bahwa nilai desimal dibulatkan ke bilangan bulat terdekat. Jadi, 1.4 dibulatkan menjadi 1 yang terlalu lambat sementara 1,5 dibulatkan menjadi 2 yang OK.

terdon
sumber
7
Waspadalah mencoba menetapkan penundaan ke nilai desimal. Delay disimpan dalam dua byte (implikasinya adalah bahwa keterlambatan frame terbesar adalah 655360ms) dan merupakan integer yang tidak ditandatangani. Konversi membulatkan nilai Anda menjadi bilangan bulat terdekat. en.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_GIF
David Mah
3
@ David ah, itu masuk akal. Jadi 1,5 berfungsi karena dibulatkan menjadi 2 sedangkan 1,4 tidak karena dibulatkan ke 1.
terdon
6

Saya sudah lebih sukses menggunakan XxYnotasi keterlambatan, pada dasarnya xadalah seperti /, jadi jika Anda menentukan -delay 1x20, frame ditampilkan selama 1 / 20th per detik.

kralyk
sumber