ฉันต้องการปรับขนาดไฟล์ภาพเคลื่อนไหว GIF เช่น do.gif
ถ้าฉันฉันจะconvert do.gif -resize 24x24\! do-24.gif
ได้รับการปรับขนาดในdo-24.gifแต่ไม่เคลื่อนไหว
วิธีการปรับขนาดให้ถูกต้องเพื่อรับภาพเคลื่อนไหวเดียวกัน
ฉันต้องการปรับขนาดไฟล์ภาพเคลื่อนไหว GIF เช่น do.gif
ถ้าฉันฉันจะconvert do.gif -resize 24x24\! do-24.gif
ได้รับการปรับขนาดในdo-24.gifแต่ไม่เคลื่อนไหว
วิธีการปรับขนาดให้ถูกต้องเพื่อรับภาพเคลื่อนไหวเดียวกัน
คำตอบ:
วิ่งครั้งแรก:
convert do.gif -coalesce temporary.gif
แล้วก็
convert -size <original size> temporary.gif -resize 24x24 smaller.gif
gifsicle --resize 24x24 > do-24.gif
สามารถในการนี้มากเกินไป
-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
ขณะที่เต็มกรอบขนาด 1024x1024
1
จากนั้นหากเราเปรียบเทียบการแปลงทั้งสาม:
out.gif
: เฟรมทั้งหมดมี256x256
ขนาดใหญ่ขึ้นและใหญ่ประมาณ 5MiB ต้องทำทำไม
มองเห็นไม่ถูกต้องเนื่องจาก256x256
เฟรมประมาณนั้นมีออฟเซ็ตที่ไม่เป็นศูนย์เช่น125+128
สำหรับเฟรม 2!
out-coalesce.gif
: เฟรมทั้งหมดอยู่และมีความถูกต้องชดเชย256x256
0+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
ผมกำลังมองหาวิธีการแก้ปัญหา ImageMagick ที่ผมคุ้นเคยกับมัน แต่ในที่สุดฉันไปกับ @ gifsicle
ข้อเสนอแนะของ มันทำในสิ่งที่ฉันต้องการไม่ยุ่งยาก
สามารถปรับขนาดไฟล์ที่ได้ให้เหมาะสมในหลาย ๆ ทาง แต่ฉันไปด้วยการลดขนาดและลดจำนวนสี ทำงานเหมือนมีเสน่ห์:
gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
-coalesce
"สร้างมุมมองที่สมบูรณ์ของภาพเคลื่อนไหวในแต่ละจุดบิตเหมือนแถบภาพยนตร์จริงแทนที่จะเป็นลำดับภาพเคลื่อนไหวลำดับดังกล่าวที่รู้จักกันในชื่อว่าCoalesced Animationนั้นง่ายกว่ามากในการศึกษาแก้ไขดัดแปลงและปรับแต่งใหม่"