การสร้างภาพเคลื่อนไหว GIF จากไฟล์ PNG


83

มีเครื่องมือในการสร้างgifภาพเคลื่อนไหวจากชุดของpngไฟล์หรือไม่?

ฉันลองconvertคำสั่งจากชุดImageMagickแต่ไม่ประสบความสำเร็จเสมอไป นอกจากนี้ฉันมีปัญหาหลายประการกับสิ่งนี้:

  1. ฉันไม่สามารถบอกได้ว่าความคืบหน้าคืออะไร
  2. ไม่ว่าฉันจะลองอะไร-delayธงจะไม่เปลี่ยนอัตราเฟรมของภาพเคลื่อนไหว gif
  3. convertกำหนดลำดับเฟรมตามลำดับตัวอักษรของชื่อไฟล์ ซึ่งหมายความว่าname500.pngจะถูกวางไว้หลังจากname50.pngและไม่หลังจากที่name450.pngฉันสามารถแก้ไขได้โดยการเพิ่ม 0 แต่สิ่งนี้น่ารำคาญ

[ข่าว]มีการทับซ้อนกันอย่างมากระหว่าง Ubuntu Stackexchange และ Unix Stackexchange ผมพยายามที่จะจัดหมวดหมู่กระทู้บางที่นี่
hhh

เกี่ยวกับรายการ 3 คุณยังคงสามารถใช้งานได้convertหลังจากจัดเรียงไฟล์ อาจเป็นไปได้ว่างานนี้files=$(ls name*png | sort -n -tname -k1); convert $files animation.gif
altroware

สำหรับจุดที่ 1: convert มี-monitorพารามิเตอร์ที่ติดตามกระบวนการ
Curlew

คำตอบ:


50

ffmpeg รุ่นที่ใหม่กว่าไม่มี -sameq ( ดู faq ) แต่มีการรองรับ GIF

ffmpeg -i %03d.png output.gif

โดยที่% 03d เป็น ID เฟรมใน 3 หลัก

คุณอาจลองใช้ffmpegเพื่อสร้างภาพยนตร์จากลำดับของภาพแล้วแปลงภาพยนตร์เป็นภาพเคลื่อนไหว GIF (ใช้อีกครั้งffmpeg)

# cf. http://pages.uoregon.edu/noeckel/MakeMovie.html

# first convert an image sequence to a movie
ffmpeg -sameq -i %03d.jpg output.mp4

# ... and then convert the movie to a GIF animation
ffmpeg -i output.mp4 -pix_fmt rgb24 -s qcif -loop_output 0 output.gif

10
คำสั่งนี้ล้าสมัย
บำรุงรักษาสูง

3
sameqตัวเลือกที่ไม่สามารถใช้ได้อีกต่อไป นอกจากนี้สำหรับฉันมันเขียนทับไฟล์ภาพดั้งเดิมและไม่สร้างไฟล์ภาพยนตร์ที่ถูกต้อง
แร่

จุดทิ้ง-sameqโค้ดไว้ตรงไหน? ทำไมคุณถึงต้องการใช้รูปแบบวิดีโอที่เสีย ( output.mp4) เป็นแบบชั่วคราว และถ้าเป็นเช่นนั้นทำไม "คุณภาพเดียวกัน" เป็นอินพุตแทนที่จะเป็นบิตเรตที่สูงมาก การประดิษฐ์จากนั้นจะทำให้สิ่งเลวร้ายยิ่งขึ้นสำหรับตัวเข้ารหัส GIF หากคุณไม่จำเป็นต้องใช้วิดีโอเป็นชั่วคราวคุณต้องการใช้บางสิ่งที่ไม่สูญเสียเช่น huffyuv หรือ MJPEG ที่ไม่มีการแปลงรหัสเพียงแค่ทำการปรับอินพุต jpegs ให้เป็น MJPEG ( -codec:video copy)
Peter Cordes

80

convertเป็นเครื่องมือบรรทัดคำสั่งที่ใช้งานง่ายในการทำเช่นนั้น cdไปที่โฟลเดอร์ที่มีpng -files ของคุณและเรียกใช้คำสั่งนี้:

convert -delay 10 -loop 0 *.png animation.gif

ที่มา: http://ubuntuforums.org/showthread.php?t=1132058


5
คำถามที่กล่าวถึงconvertและปัญหาบางอย่างใช้มัน คำตอบของคุณไม่ได้ตอบคำถามใด ๆ
Mat

3
ในฐานะของ ImageMagick เวอร์ชัน6.8.7-4 2013-11-02 Q16นี้ใช้งานได้สำหรับฉัน
Rudy Matela

7
ใช้งานได้ แต่10หมายถึง 10 * 10ms เร็วมาก ความล่าช้าของ a 100คือ 1 วินาที
Anne van Rossum

7
ใช้ตัวเลือก-dispose previousหรือ-dispose 2หากคุณกำลังทำงานกับ PNG แบบโปร่งใส
Hải Phong

4
ทราบว่าตัวเอง: การขยายตัวรั้งจะมีประโยชน์สำหรับการระบุรายชื่อของภาพที่เป็นข้อโต้แย้งเช่นpic_{0..20..2}.pngขยายpic_0.png, pic_2.pngทุกทางไปpic_20.png
Yibo ยาง

19

convert's --delayตัวเลือกเดียวที่นำไปใช้กับภาพถัดไปในบรรทัดคำสั่ง ดังนั้นconvert -delay 10 *จะตั้งค่าการหน่วงเวลาของเฟรมแรกเป็น 0.1 วินาทีเท่านั้น ต้องทำซ้ำตัวเลือก:

convert $(for a in *; do printf -- "-delay 10 %s " $a; done; ) result.gif

สำหรับความต้องการการเรียงลำดับของคุณแปลงไม่ได้เรียงลำดับเฟรม globing เปลือก*ไม่ หากคุณรู้ว่าเฟรมของคุณมีหมายเลขตั้งแต่ 0 ถึง 700 คุณสามารถคำนวณตัวเลขด้วยตัวคุณเอง:

convert $(for ((a=0; a<700; a++)); do printf -- "-delay 10 name%s.png " $a; done;) result.gif

5
ฉันไม่ได้พบกับพฤติกรรมนี้ด้วยconvertสำหรับฉันconvert -delay 1000 -loop 0 *.png animation.gifเพิ่มความล่าช้า 10 วินาทีระหว่างแต่ละภาพ
แร่

1
คุณยังสามารถใช้การเรียงลำดับรุ่นของlsคำสั่ง นั่นคือ:convert -delay 1000 $(ls -v name*png) output.gif
erik

7

ปรับปรุง:

ใช้convertสำหรับ png-to-gif จากนั้นใช้gifsicleสำหรับภาพเคลื่อนไหว ไม่ใช่แอปเดียวที่ต้องทำทุกอย่างแก้ไขได้ แต่สามารถใช้สคริปต์ได้


GIMPสามารถสร้าง gif ที่เคลื่อนไหวได้และให้การควบคุมเวลา / ความล่าช้าและการทำซ้ำเป็นต้น


3
ฉันรู้เกี่ยวกับขลิบด้าย แต่ฉันไม่รู้วิธีเขียนสคริปต์ นอกจากนี้การใช้ gimp เพื่อสร้างอนิเมชั่นก็เหมือนกับการฆ่าแมลงวันด้วยปืนใหญ่
Yotam

1
นั่นเป็นความคิดที่ไม่ดี คุณภาพจะน่ากลัวเนื่องจากแต่ละเฟรมจะถูกแยกเป็นสัดส่วน
Clément

2

ImageMagick สามารถสร้างภาพเคลื่อนไหว gif คุณภาพดี ตรวจสอบวิดีโอนี้ - http://www.youtube.com/watch?v=OFusYizJ-bA


6
ยินดีต้อนรับสู่ Unix & Linux! โดยทั่วไปเราชอบคำตอบในเว็บไซต์เพื่อให้สามารถยืนได้ด้วยตัวเอง - ลิงค์นั้นดี แต่ถ้าลิงค์นั้นเคยทำลายคำตอบควรมีข้อมูลเพียงพอที่จะยังคงเป็นประโยชน์ โปรดพิจารณาแก้ไขคำตอบของคุณเพื่อรวมรายละเอียดเพิ่มเติม ดูคำถามที่พบบ่อยสำหรับข้อมูลเพิ่มเติม
slm

ช่างเป็นความคิดเห็นที่มีประโยชน์ข้างต้น ....
Luke

convert -delay 200 -loop 0 *.jpg output.gif
ลุค

2

ffmeg ตัวเลือก GIF สำคัญ + ข้อมูลการทดสอบ

เพื่อเติมเต็มคำตอบนี้ :

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i 'tmp.*.png' \
  -r 15 \
  -vf scale=512:-1 \
  out.gif \
;

ข้อมูลการทดสอบถูกสร้างขึ้นด้วย: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

ffmpegตัวเลือกที่สำคัญที่ฉันต้องการเน้นคือ:

  • -patter_type glob: วิธีเลือกภาพที่สะดวก
  • -framerate 60และ-r 15: สมมติว่า 60 FPS สำหรับภาพอินพุต ( ffmpegไม่ทราบเป็นอย่างอื่นเนื่องจากไม่มีข้อมูล FPS ในภาพเหมือนในรูปแบบวิดีโอ) ให้เลือกหนึ่งภาพทุกๆ 4 ภาพเพื่อลดขนาด ( 4 == 60 / 15)
  • -vf scale=512:-1: ตั้งค่าความกว้างความสูงของสเกลตามสัดส่วนโดยปกติเพื่อลดขนาดและประหยัดพื้นที่

ดูสิ่งนี้ด้วย:

ทดสอบใน Ubuntu 18.10, ffmpeg 4.0.2


-1

ในประเด็นที่ 2

เวอร์ชั่นของ ImageMagick "display" ฉันมี (ImageMagick 6.7.2-7 2017-01-12) ละเว้นอัตราเฟรมที่กำหนดโดยใช้คำสั่ง convert เพื่อสร้าง gif แบบเคลื่อนไหว ลองใช้โปรแกรมอื่นเพื่อดูภาพเคลื่อนไหว gif เช่น firefox

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