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


46

ฉันต้องการปรับขนาดไฟล์ภาพเคลื่อนไหว GIF เช่น do.gif ป้อนคำอธิบายรูปภาพที่นี่

ถ้าฉันฉันจะconvert do.gif -resize 24x24\! do-24.gifได้รับการปรับขนาดในdo-24.gifแต่ไม่เคลื่อนไหวป้อนคำอธิบายรูปภาพที่นี่

วิธีการปรับขนาดให้ถูกต้องเพื่อรับภาพเคลื่อนไหวเดียวกัน

คำตอบ:


56

วิ่งครั้งแรก:

convert do.gif -coalesce temporary.gif

แล้วก็

convert -size <original size> temporary.gif -resize 24x24 smaller.gif

2
-coalesce"สร้างมุมมองที่สมบูรณ์ของภาพเคลื่อนไหวในแต่ละจุดบิตเหมือนแถบภาพยนตร์จริงแทนที่จะเป็นลำดับภาพเคลื่อนไหวลำดับดังกล่าวที่รู้จักกันในชื่อว่าCoalesced Animationนั้นง่ายกว่ามากในการศึกษาแก้ไขดัดแปลงและปรับแต่งใหม่"
sam

28
gifsicle --resize 24x24 > do-24.gifสามารถในการนี้มากเกินไป
sam

2
โปรดทราบว่ามุมมอง coalesced มีขนาดใหญ่กว่ามุมมองที่ปรับให้เหมาะสมที่สุด (3.2 เท่าในการทดสอบของฉัน) และการปรับขนาดจะสร้างภาพที่รวมกันซึ่งสามารถใหญ่กว่าต้นฉบับในขนาดไฟล์ (2.3 เท่าในการทดสอบของฉัน) แม้ว่าความละเอียด มีขนาดเล็กลง เมื่อฉันลองปรับขนาดโดยตรงดูดีและมีขนาดไฟล์เล็ก ๆ ถึงแม้ว่ามันอาจจะใช้งานได้กับรูปภาพนี้เท่านั้น
endolith

1
gifsicle ให้ผลลัพธ์ที่ดีกว่ามากขึ้นและได้รับการปรับปรุงสำหรับกรณีการใช้งานของฉัน ขอบคุณ @ แซม!
sj26

4
แปลง temporary.gif -resize 24x24 เล็กกว่าทำงานได้โดยไม่ต้องระบุขนาดอินพุต
AMB

3

-coalesce + -deconstruct

หลังจากนั้น-coalesceคุณอาจต้องการเพิ่ม-deconstruct:

convert in.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif

สาเหตุหลักของปัญหาคือ GIF อินพุตของคุณถูกย่อให้เล็กสุด: GIF อนุญาตให้เฟรมถัดไปเป็นเพียงสี่เหลี่ยมผืนผ้าที่ถูกแก้ไขจากเฟรมก่อนหน้านี้ที่ออฟเซ็ต

-coalesceจากนั้นขยายเฟรมทั้งหมดให้เป็นขนาดดั้งเดิมซึ่งทำให้การปรับขนาดทำงาน แต่จะไม่บีบอัดเฟรมอีกครั้งในขณะที่ภาพอินพุตของคุณ: -deconstructจำเป็นสำหรับสิ่งนั้น!

การใช้ข้อมูลทดสอบจากคำตอบนี้: ฉันจะสร้าง gif แบบเคลื่อนไหวจากภาพนิ่งได้อย่างไร (ควรใช้บรรทัดคำสั่ง) เราสามารถเห็นสิ่งนี้ได้อย่างชัดเจนด้วยidentify:

$ identify out-convert.gif | head -n 3
out-convert.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.020u 0:00.019
out-convert.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019
out-convert.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019

$ convert out-convert.gif -resize 256x out.gif
$ identify out.gif | head -n 3
out.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[1] GIF 256x256 256x256+125+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[2] GIF 256x258 256x256+123+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009

$ convert out-convert.gif -coalesce -resize 256x out-coalesce.gif
$ identify out-coalesce.gif | head -n 3
out-coalesce.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[1] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[2] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009

$ convert out-convert.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
$ identify out-deconstruct.gif | head -n 3
out-deconstruct.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[1] GIF 135x135 256x256+60+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[2] GIF 135x136 256x256+59+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010

out.gif

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

ออก coalesce.gif

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

ออก deconstruct.gif

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

อันดับแรกเรามาดูวิธีการใส่ไฟล์, out-convert.gifได้รับในความเป็นจริงที่ถูกบีบอัดตั้งแต่กรอบ 2 เป็นเพียง516x516ที่ออฟเซต252+257ขณะที่เต็มกรอบขนาด 1024x10241

จากนั้นหากเราเปรียบเทียบการแปลงทั้งสาม:

  • out.gif: เฟรมทั้งหมดมี256x256ขนาดใหญ่ขึ้นและใหญ่ประมาณ 5MiB ต้องทำทำไม

    มองเห็นไม่ถูกต้องเนื่องจาก256x256เฟรมประมาณนั้นมีออฟเซ็ตที่ไม่เป็นศูนย์เช่น125+128สำหรับเฟรม 2!

  • out-coalesce.gif: เฟรมทั้งหมดอยู่และมีความถูกต้องชดเชย256x2560+0

    เอาต์พุตดูเหมือนถูกต้อง แต่ขนาดไฟล์เอาต์พุตคือ 2.0 MiB ซึ่งใหญ่กว่า out-deconstruct.gif

  • out-deconstruct.gif: เฟรมที่ถูกบีบอัดขนาดเอาต์พุตสุดท้าย 1.9 MiB

    ไม่เล็กไปกว่าout-coalesce.gifนี้มากนัก แต่ฉันคิดว่านี่เป็นเพียงเพราะพื้นดำบีบอัดได้ดีจริง ๆ และอาจมีความสำคัญโดยทั่วไป

ffmpeg และ gifsicle

ฉันยังลองใช้คำสั่งต่อไปนี้:

ffmpeg -i out-convert.gif -vf scale=256:-1 out-ffmpeg-small.gif
gifsicle --resize 256x256 out-convert.gif > out-gifsicle.gif

และทั้งคู่ผลิตเอาต์พุต 1.5 MiB ที่เล็กลงอย่างถูกต้อง

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

สิ่งที่ต้องทำ: ทำไมพวกเขาถึงทำให้มันเล็กกว่าconvert? พวกเขาเพียงแค่เลือกสี่เหลี่ยม diff ที่น้อยกว่าหรือดีกว่า

ทดสอบใน Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8


3

ผมกำลังมองหาวิธีการแก้ปัญหา ImageMagick ที่ผมคุ้นเคยกับมัน แต่ในที่สุดฉันไปกับ @ gifsicleข้อเสนอแนะของ มันทำในสิ่งที่ฉันต้องการไม่ยุ่งยาก

สามารถปรับขนาดไฟล์ที่ได้ให้เหมาะสมในหลาย ๆ ทาง แต่ฉันไปด้วยการลดขนาดและลดจำนวนสี ทำงานเหมือนมีเสน่ห์:

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