Neden yarattığım gif neden bu kadar yavaş?


33

ImageMagick'i pngs koleksiyonunu tek bir gif'e çevirmek için kullanıyorum. Bu gif'in mümkün olduğunca çabuk dönmesini istiyorum.

Bu yaklaşık olarak beklediğim çıktı ( Wikipedia'nın izniyle ):

beklenen çıktı

Bu gerçekten alıyorum çıktı:

gerçek çıktı

Tarayıcımda (Firefox 17), beklenen gif gerçek gif'in iki katından daha hızlı çalışıyor. Bu beni şaşırtıyor, çünkü her karenin 0 gecikmesi gerektiğini belirttim.

İlk önce Vikipedi'den alınan gifleri patlatarak 36 pngs oluşturdum:

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

Sonra coalescepngs'leri bir gif olarak birleştirmek için kullanılır .

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

identify Her karenin gecikme olmadığını onaylar:

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,

Bu, aslında, orijinalinden daha az gecikmedir:

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,

Gerçek gif, beklenen gif'ten daha az gecikmeye sahiptir. Öyleyse neden beklenen gif gerçek gif'in iki katı?


1
Merak etmeden, gecikmeyi 0 yerine 1 olarak ayarlarsanız ne olur?
mgilson

1
kare hızı sorunu gibi görünüyor.
SnakeDoc

@mgilson, daha yeni denedim. 0 gecikmeli görüntü ve 1 gecikmeli görüntü mükemmel bir şekilde senkronize edilmiş gibi görünüyor. Tuhaf, çünkü 1-gecikmeli görüntü her döngünün saniyenin 36 / 100'ünün gerisinde kalmalıdır.
Kevin

1
tl; dr bu soruda: Kullanın-delay 2 .
Matt M.

Yanıtlar:


17

10ms (delay = 1) versiyonunu denedim ve yarattım.

10ms gecikme örneği

Gif yapan programlar, ikinci bir gecikme oranının 0. Bunun yerine, seçtiğiniz küçük değerden çok daha büyük bir değer kullanırlar.

Bunu neden yaptıkları hakkında gerçekten yorum yapamam. Birden fazla sebeple karşılaştım ve hepsinin spekülasyonu olabilir.

Genel olarak, her durumda en az iki yüz saniyelik bir gecikme kullanmanızı öneririm.

Kaynaklar (bunun bunun nasıl bir çok nedeni olduğunu gösteren kanıtlar. Bazıları nispeten eski):


1
Oluşturma programı çok hızlı olan tüm gifleri yavaşlatırsa, Wikipedia'nın gif'i kendi giflerim kadar yavaş olacaktır. Ama öyle değil. Wikipedia neden hız sınırını kırabilir ve ben yapamam?
Kevin

2
@Kevin: Çok hızlı olan tüm GIF'leri yavaşlatıyor. GIF’leriniz çok hızlı. Wikipedia'nın GIF'leri çok hızlı değil. Yavaşlaman gerekiyor, böylece "çok hızlı" olmayacaksın.
David Schwartz

Vikipedi gif aralığında 20 ms ile 50 ms arasında bir çerçeve ertelenir. Kendi kare gecikmemi 20 msn olarak ayarladıysam, teorik olarak Wikipedia gif ile aynı "çok hızlı değil" kriterlerini karşılamasına rağmen hala daha yavaş.
Kevin

2
20ms gecikmeli bir wikipedia resmin yanı sıra, 20ms gecikmeli olarak da oluşturduğunuz bir gif eklerseniz, ben bir göz atacağım.
David Mah

2
Hatalıydım. Oluşturduğum 20 ms gif gerçekten Wikipedia gif kadar hızlı.
Kevin

18

@DavidMah haklı gibi görünüyor. Linux sistemimde minimum gecikme 0,5:

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

görüntü tanımını buraya girin

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

görüntü tanımını buraya girin

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

görüntü tanımını buraya girin

Nedense görüntüler tarayıcımda düzgün görüntülenmiyor gibi görünüyor. Yerel bir resim görüntüleyici ( eom) kullanıldığında, 1. resim orijinal sorudaki resimdeki kadar yavaş ve diğer ikisi de wikipedia'nınkilerden daha hızlı. Tarayıcım için özel bir sorun olması durumunda yine de gönderiyorum. Her durumda, yukarıda belirtilen komutları denediğinizde daha iyi hızlar elde etmelisiniz.


GÜNCELLEME: 2 sorun var gibi görünüyor. Tarayıcılar (en azından y firefox ve Linux'ta çalışan krom), <1.5 gecikme ile oluşturulan gifleri görüntüleyemez. 1.5 iyi çalışıyor, 1.4 yavaş. Resim görüntüleyicim 0,5 ve üzeri gecikmelerle başa çıkabilir. Yukarıdaki görüntülerden birini indirmeyi ve en sevdiğiniz görüntü görüntüleyicide açmayı deneyin. Ayrıca, şunlara bir göz atın:

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

görüntü tanımını buraya girin

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

görüntü tanımını buraya girin

UPDATE2: @DavidMah, aşağıdaki yorumlarda ondalık değerlerin en yakın tam sayıya yuvarlandığını belirtiyor. Bu yüzden, 1.4, 1'e yuvarlanır ve bu, çok yavaş olurken, 1,5, tamam olan 2'ye yuvarlanır.


7
Ondalık değerlere gecikme atamaya çalışırken dikkatli olun. Gecikme iki baytta saklanır (bunun üzerindeki sonuçlar en büyük kare gecikmesinin 655360ms olmasıdır) ve işaretsiz bir tamsayıdır. Dönüştürme, değerlerinizi en yakın tam sayı olacak şekilde yuvarlıyor. en.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_GIF
David Mah

3
@DavidMah ah, bu mantıklı. O 1'e yuvarlanır çünkü 1.5 eser Yani öyle değil 2 1.4 iken yuvarlanır çünkü
Terdon

6

XxYGecikme gösterimini kullanma konusunda daha fazla başarı elde ettim , esasen a'ya xbenziyor /, yani belirtirseniz -delay 1x20, kare saniyenin 1 / 20'si için görüntülenir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.