ทำไม gif ที่ฉันสร้างช้ามาก?


33

ฉันใช้ ImageMagick เพื่อเปลี่ยนชุด pngs เป็น gif เดียว ฉันต้องการให้ GIF นี้วนซ้ำเร็วที่สุด

นี่เป็นผลลัพธ์โดยประมาณที่ฉันคาดหวัง (ความอนุเคราะห์จากWikipedia ):

ผลผลิตที่คาดหวัง

นี่คือผลลัพธ์ที่ฉันได้รับจริง:

เอาต์พุตจริง

บนเบราว์เซอร์ของฉัน (Firefox 17) gif ที่คาดหวังจะทำงานมากกว่าสองเท่าของ gif ที่แท้จริง สิ่งนี้ทำให้ฉันประหลาดใจเพราะฉันระบุว่าแต่ละเฟรมควรมีความล่าช้า 0

ก่อนอื่นฉันสร้าง 36 pngs โดยระเบิด gif ที่ยืมมาจาก Wikipedia:

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

จากนั้นฉันก็coalesceรวมตัว pngs เข้ากับ 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 วินาทีของทุก ๆ ลูป
Kevin

1
TL; DR กับคำถามนี้: การใช้งาน -delay 2
แมตต์เอ็ม

คำตอบ:


17

ฉันทดลองและสร้างเวอร์ชัน 10ms (delay = 1)

ตัวอย่างการหน่วงเวลา 10ms

ดูเหมือนว่าโปรแกรมที่แสดง gif มักจะไม่ให้เกียรติกับอัตราการหน่วงเวลา 0 วินาที แต่จะใช้ค่าที่มากกว่าค่าขนาดเล็กที่คุณเลือก

ฉันไม่สามารถแสดงความคิดเห็นได้อย่างแท้จริงถึงสาเหตุที่พวกเขาทำเช่นนี้ ฉันเจอมากกว่าหนึ่งเหตุผลและเป็นไปได้ที่การเก็งกำไรทั้งหมด

โดยทั่วไปฉันขอแนะนำให้คุณใช้เวลาอย่างน้อยสองร้อยวินาทีในทุกกรณี

แหล่งที่มา (ที่แสดงให้เห็นว่ามีเหตุผลหลายประการสำหรับเรื่องนี้บางอย่างค่อนข้างเก่า):


1
หากโปรแกรมการเรนเดอร์ช้า gif ทั้งหมดที่เร็วเกินไป gif ของ Wikipedia จะช้าเท่ากับ gif ของฉันเอง แต่มันไม่ใช่ ทำไมวิกิพีเดียถึงขีด จำกัด ความเร็วและฉันทำไม่ได้
Kevin

2
@Kevin: มันช้าลง GIF ทั้งหมดที่เร็วเกินไป GIF ของคุณเร็วเกินไป GIF ของ Wikipedia นั้นไม่เร็วเกินไป คุณต้องชะลอตัวลงดังนั้นคุณจะไม่ "เร็วเกินไป"
David Schwartz

ความล่าช้าของเฟรมสำหรับช่วง gif ของ Wikipedia ระหว่าง 20 ms และ 50 ms หากฉันตั้งค่าการหน่วงเฟรมของตัวเองไว้ที่ 20 มิลลิวินาทีก็ยังช้ากว่าแม้ว่าในทางทฤษฎีแล้วมันจะตรงตามเกณฑ์ "ไม่เร็วเกินไป" เช่นเดียวกับ Wikipedia gif
Kevin

2
หากข้างๆภาพวิกิพีเดียที่มีความล่าช้า 20 มิลลิวินาทีคุณรวมถึง GIF ที่คุณสร้างขึ้นด้วยความล่าช้า 20 มิลลิวินาทีฉันจะดูด้วย
David Mah

2
ฉันเข้าใจผิด 20 มิลลิวินาที gifฉันสร้างแน่นอนที่รวดเร็วเป็น GIF วิกิพีเดีย
Kevin

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 นั้นช้าเท่ากับคำถามแรกและทั้งสองภาพนั้นเร็วกว่าวิกิพีเดีย ฉันกำลังโพสต์ต่อไปในกรณีที่มีปัญหาเฉพาะกับเบราว์เซอร์ของฉัน ไม่ว่าในกรณีใดคุณควรได้รับความเร็วที่ดีกว่าหากลองคำสั่งที่โพสต์ด้านบน


UPDATE: ดูเหมือนจะมีปัญหา 2 ประการ เบราว์เซอร์ (อย่างน้อย 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
ระวังการกำหนดความล่าช้าให้กับค่าทศนิยม ความล่าช้าจะถูกเก็บไว้ในสองไบต์ (ความหมายในเรื่องนี้คือความล่าช้าเฟรมที่ใหญ่ที่สุดคือ 655360ms) และเป็นจำนวนเต็มไม่ได้ลงนาม การแปลงกำลังปัดเศษค่าของคุณให้เป็นจำนวนเต็มที่ใกล้เคียงที่สุด en.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_GIF
David Mah

3
@DavidMah อาที่เข้าท่า ดังนั้น 1.5 จึงได้ผลเพราะมันถูกปัดเศษเป็น 2 ขณะที่ 1.4 ไม่ได้เพราะมันถูกปัดเศษเป็น 1
terdon

6

ฉันประสบความสำเร็จมากขึ้นในการใช้XxYเครื่องหมายการหน่วงเวลาโดยพื้นฐานแล้วxจะเป็นเช่น/นั้นดังนั้นหากคุณระบุ-delay 1x20เฟรมจะแสดงเป็นเวลา 1 ใน 20 ของวินาที

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.