ฉันจะสร้าง gif แบบเคลื่อนไหวจากภาพนิ่งได้อย่างไร (ควรมีบรรทัดคำสั่ง)


78

ฉันต้องการสร้าง.gifภาพเคลื่อนไหวจากชุด.jpgรูปภาพที่กำหนด

ฉันต้องการทำจากบรรทัดคำสั่งดังนั้นเครื่องมือบรรทัดคำสั่งจะยินดีมาก


3
ใช้งานได้ แต่หน่วยความจำหิวมาก มีโหลดของหลอกที่อาจเกิดขึ้นแม้ว่า: askubuntu.com/questions/648244/... askubuntu.com/questions/457351/... askubuntu.com/q/573712/178596 askubuntu.com/questions/566476/... askubuntu.com/questions/ 380875 / … askubuntu.com/q/636149/178596
Wilf

คำตอบ:


87

คุณสามารถใช้แพ็คเกจImageMagick ติดตั้งโดยใช้คำสั่ง:

sudo apt-get install imagemagick

ตอนนี้คุณสามารถสร้างgifจากจำนวนรูปภาพ ( jpg) โดยใช้:

convert -delay 20 -loop 0 *.jpg myimage.gif

6
โปรดรวมที่นี่วิธีการปรับขนาดภาพเคลื่อนไหว gif และอื่น ๆ ที่นี่ 50% -resize 50%ฯลฯ
LéoLéopold Hertz 준영

Ubuntu 18.10 ล้มเหลวด้วย "ทรัพยากรแคชหมด" สำหรับภาพเหล่านี้: github.com/cirosantilli/media/blob/master/…เกี่ยวข้อง: superuser.com/questions/1178666/ …
Ciro Santilli 新疆改造中心中心六四事件

ผู้ใช้ ImageMagick -deconstructมีแนวโน้มที่จะยังต้องการ: ฉันยังพบว่า ImageMagick หิวมากหน่วยความจำดูมาตรฐาน: askubuntu.com/a/1102183/52975
Ciro Santilli 新疆改造中心中心法轮功六四事件

convert -delay 0 -loop 0 *.tif myanimated.gifทำงานได้เป็นอย่างดีในไฟล์ 720 tif
ron

46

หากต้องการคำตอบ @Maythux ให้สมบูรณ์:

เพื่อหลีกเลี่ยงการสร้างไฟล์ที่มีขนาดใหญ่มากคุณสามารถใช้-resizeตัวเลือก:

ในกรณีของฉันฉันมีภาพ 4608x3456 และ gif ที่สร้างขึ้นมีมากกว่า 300M สำหรับ 32 ภาพ

convert -resize 20% -delay 20 -loop 0 *.jpg myimage.gif

หรือ

convert -resize 768x576 -delay 20 -loop 0 *.jpg myimage.gif

ดูแล * .jpg

*.jpg ดูดบิตเมื่อจัดการกับค่าตัวเลขคุณอาจสร้าง gif ด้วยภาพที่ไม่ได้เรียง

$ ls|cat
21-33-26_1.jpg
21-33-26_10.jpg   // <--- this one
21-33-26_2.jpg
21-33-26_3.jpg
21-33-26_4.jpg
21-33-26_5.jpg
21-33-26_6.jpg
21-33-26_7.jpg
21-33-26_8.jpg
21-33-26_9.jpg
21-33-28_1.jpg    // <--- should be here    
21-33-28_2.jpg
21-33-28_3.jpg
...

ในฐานะที่เป็นภาพที่ถูกนำอย่างรวดเร็ว (10 / s) พวกเขาทั้งหมดมีการปรับเปลี่ยนเวลาเดียวกันและคุณไม่สามารถหลอกใช้ls -tตัวอย่างเช่น บน Ubuntu คุณสามารถใช้ls -vแทนได้เช่น:

convert -resize 768x576 -delay 20 -loop 0 `ls -v` myimage.gif

การเรียงลำดับตัวเลขค่อนข้างยุ่งยากใน Mac OS X แต่ฉันคิดว่าคุณจะต้องสร้างสคริปต์ที่กำหนดเอง


4
คุณสามารถหลีกเลี่ยงปัญหา * .jpg ของคุณได้โดยส่งต่อการเติมเต็มด้วยเลขศูนย์ "01.jpg" แทน "1.jpg" และอื่น ๆ ถ้าคุณไปถึงเลขสามหลักแล้ว "001.jpg", "010.jpg" ฯลฯ
bigreddmachine

2
มีหลายวิธีในการแก้ไขปัญหาลำดับชื่อไฟล์ รวมถึงfind,, sortการขยายรั้งและอื่น ๆ lsเครื่องมือเป็นฉาวโฉ่ไม่เหมาะสมสำหรับชนิดของสิ่งนี้ findใช้ มีช่วงของการเรียนรู้เล็กน้อย แต่มันก็คุ้มค่า
เสียง

ผู้ใช้บางคนอาจสนใจแก้ไขชื่อไฟล์ด้วย massren: github.com/laurent22/massren
Graham P Heath

มันใช้เวลานานในการทำให้สำเร็จ มีตัวเลือก verbose หรือไม่?
ouranos

21

ฉันไม่มีชื่อเสียงพอที่จะแสดงความคิดเห็น แต่แทนที่จะแก้ไขชื่อไฟล์คุณสามารถใช้ globbing เพื่อรับเชลล์ของคุณเพื่อขยายชื่อไฟล์

convert -resize 50% -delay 10 -loop 0 image_{0..99}.jpg output.gif

11

GIMP

คุณสามารถทำสิ่งนี้ได้อย่างง่ายดายด้วย GIMP ก่อนติดตั้งถ้ายังไม่ได้ติดตั้งด้วย

sudo apt-get install gimp

การสร้าง gif

จาก GIMP ให้ไปที่ไฟล์ -> เปิดเป็นเลเยอร์เพื่อเปิด png ทั้งหมดในเลเยอร์ของตนเอง

เปิดเป็นเลเยอร์

จากที่นี่คุณสามารถดำเนินการแก้ไขในชั้นและทำครั้งเดียวให้ไปที่ File -> ส่งออกเป็น จากกล่องโต้ตอบให้แน่ใจว่าได้ตั้งประเภทไฟล์เป็น GIF

ตั้งค่าประเภทไฟล์เป็น GIF

จากนั้นคุณจะไปที่ตัวเลือกการส่งออก GIF ทำเครื่องหมายตัวเลือก' เป็นภาพเคลื่อนไหว ' และตั้งค่าพารามิเตอร์ตามต้องการ

ตัวเลือกการส่งออก GIF


7

โซลูชัน ffmeg + ข้อมูลการทดสอบ

ตั้งแต่ Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8 ฉันพบว่า ffmpeg นั้นเร็วกว่ามากและใช้หน่วยความจำน้อยกว่ามาก

คำสั่งการแปลงที่ง่ายที่สุดคือ:

ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i '*.png' \
  -r 15 \
  -vf scale=512:-1 \
  out.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

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

และนี่คือข้อมูลทดสอบอื่นที่คุณสามารถสร้างได้โดยตรงจากเบราว์เซอร์ของคุณ! https://stackoverflow.com/questions/19235286/convert-html5-canvas-sequence-to-a-video-file/57153718#57153718

ป้อนคำอธิบายรูปภาพที่นี่

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

  • -pattern_type glob: วิธีเลือกภาพที่สะดวก

  • -framerate 60: สมมติว่า 60 FPS สำหรับภาพที่นำเข้าและส่งออก FPS เดียวกัน

    ffmpeg ไม่ทราบเป็นอย่างอื่นเนื่องจากไม่มีข้อมูล FPS อยู่ในภาพเนื่องจากมีอยู่ในรูปแบบวิดีโอ

    เฟรมอินพุต 256 เฟรมใช้เวลาประมาณ 4 วินาทีจึงจะเสร็จสิ้น

    -r 15: ไม่จำเป็น. เลือกหนึ่งภาพทุกๆ 4 ภาพเพื่อลดขนาด ( 4 == 60 / 15)

    ด้วยมันidentify out.gifบอกว่า GIF มีเพียง 64 เฟรม

    ยังคงใช้เวลาในการเล่น 4 วินาทีดังนั้นความล่าช้าจึงเปลี่ยนแปลงเพื่อให้สิ่งต่าง ๆ ตรงกัน

  • -vf scale=512:-1: ไม่จำเป็น. ตั้งค่าความกว้างความสูงของสเกลตามสัดส่วนโดยปกติเพื่อลดขนาดและประหยัดพื้นที่

เพื่อให้ ImageMagick ทำงานได้ฉันต้องแก้ไขขีด จำกัด ของดิสก์และหน่วยความจำ/etc/ImageMagick-6/policy.xmlตามที่อธิบายไว้ที่: https://superuser.com/questions/1178666/imagemagick-convert-quits-after-some-pages

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

ImageMagick เทียบกับมาตรฐาน ffmpeg

ฉันเปรียบเทียบคำสั่ง:

/usr/bin/time -v convert *.png -deconstruct -delay 1.6 out-convert.gif
/usr/bin/time -v ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i '*.png' \
  out-ffmpeg.gif \
;

คำสั่งถูกสร้างขึ้นเพื่อสร้างผลลัพธ์ที่ใกล้เคียงที่สุดเพื่อให้การเปรียบเทียบมีผล:

  • /usr/bin/time -v: ใช้เพื่อค้นหาการใช้หน่วยความจำสูงสุดตามที่อธิบายไว้ที่: https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process

  • -deconstruct: รูปภาพ GIF สามารถมีเพียงสี่เหลี่ยมผืนผ้าที่ปรับเปลี่ยนน้อยที่สุดจากเฟรมก่อนหน้าเพื่อทำให้ GIF มีขนาดเล็ก

    ffmpegคำนวณส่วนต่างเหล่านั้นตามค่าเริ่มต้น แต่ ImageMagick ไม่ได้ยกเว้นว่า-deconstructใช้

    โดยทั่วไปคุณจะต้องการใช้ตัวเลือกนั้นทุกครั้งกับ ImageMagick

    เราสามารถสังเกตเห็นความแตกต่างด้วย:

    identify out.gif
    

    ด้วยเวอร์ชันบีบอัดเฟรมทั้งหมดจะมีขนาดเล็กกว่าเฟรมเริ่มต้นเช่น:

    out.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    out.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    out.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    

    ในตัวอย่างนี้เฟรมที่สองเป็นเพียง516x516แทน 1024x1024 252+257เต็มรูปแบบและจะอยู่ที่ชดเชย มันมีแค่สามเหลี่ยมกลาง

    ดูเพิ่มเติม: ฉันจะปรับขนาดไฟล์ภาพเคลื่อนไหว GIF โดยใช้ ImageMagick ได้อย่างไร

  • -delay: ค่าที่ตรงกับ 60FPS ffmpegของ ไม่ควรสำคัญสำหรับประสิทธิภาพของการแปลง แต่ฉันไม่ต้องการเสี่ยง

GIF เอาต์พุตมีขนาดเท่ากันและมีลักษณะเหมือนกัน

เราได้รับ ImageMagick:

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:56.16
Maximum resident set size (kbytes): 2676856

และสำหรับ ffmpeg:

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.41
Maximum resident set size (kbytes): 97172

จากที่เราเห็นว่า:

  • ImageMagick ใช้ RAM 2.6Gb และใช้เวลาประมาณ 1 นาที
  • ffmpeg ใช้ RAM ขนาด 100Mb และใช้เวลา 4 วินาที

ฮาร์ดแวร์ทดสอบ: แล็ปท็อป Lenovo ThinkPad P51 , Intel Core i7-7820HQ, 32GB (16 + 16) DDR4 2400MHz SODIMM, 512GB SSD PCIe TLC OPAL2


โหวตแล้วและชอบ! คำตอบที่ดีฉันมีคำถามติดตามหนึ่งข้อ ฉันมีภาพที่มีคุณภาพไม่มากนักและฉันไม่ได้ใช้-r และ-vคำสั่งยังไง gif ที่ออกมาก็มีคุณภาพต่ำกว่าไฟล์ png ดั้งเดิมมาก จะรักษาคุณภาพของ gif ให้เหมือนกับไฟล์ png ที่กำหนดได้อย่างไร
astro123

Hi @ astro123 คุณภาพต่ำลงอย่างไร ขนาดรูปภาพที่เล็กลงหรือเฟรมน้อยลงหรืออย่างอื่น (GIF ใช้การสูญเสียอย่างเห็นได้ชัดดังนั้นจึงไม่สามารถบีบอัดที่แย่กว่านี้ได้) ลอง-framerate 60 -r 60ดู ตรวจสอบ GIF และภาพที่สร้างขึ้นด้วยเครื่องมือ ImageMagick เช่นidentifyลองและค้นหาสิ่งที่เกิดขึ้น
Ciro Santilli 新疆改造中心法轮功六四事件

4

คุณสามารถใช้โปรแกรมที่เรียกว่าการแปลงที่รวมอยู่ในแพ็คเกจ imagemagick มันเป็นบรรทัดคำสั่งขับเคลื่อน แต่ใช้งานง่ายมาก ติดตั้งผ่านศูนย์ซอฟต์แวร์หรือไปที่พร้อมท์คำสั่งและพิมพ์

sudo apt-get install imagemagick

ตอนนี้เพื่อสร้าง. gif

convert -delay 100  -size 100x100 xc:SkyBlue \
          -page +5+10  balloon.gif   -page +35+30 medical.gif  \
          -page +62+50 present.gif   -page +10+55 shading.gif  \
          -loop 0  animation.gif

* หมายเหตุตัวอย่างด้านบนนี้มาจากImage Magick samples


1
ฉันจะทำรูป PNG 40 รูปใน GIF วนลูปได้อย่างไร ทั้งหมดในโฟลเดอร์ / home / fusion809 / เอกสาร / รูปภาพ
BH2017

1
@ BH2017: convert -delay 20 -loop 0 *.png out.gifสร้าง GIF แบบวนซ้ำ
unutbu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.