ฉันมี gif
ที่ฉันต้องการปรับขนาดด้วย pillow
เพื่อให้ขนาดลดลง ขนาดปัจจุบันของ gif
คือ 2MB
ฉันพยายามที่จะ
ปรับขนาดเพื่อให้ความสูง/ความกว้างเล็กลง
ลดคุณภาพลง
สำหรับ JPEG โค้ดต่อไปนี้มักจะเพียงพอเพื่อให้รูปภาพขนาดใหญ่ลดขนาดลงอย่างมาก
from PIL import Image
im = Image.open("my_picture.jpg")
im = im.resize((im.size[0] // 2, im.size[1] // 2), Image.ANTIALIAS) # decreases width and height of the image
im.save("out.jpg", optimize=True, quality=85) # decreases its quality
แต่เมื่อใช้ GIF ดูเหมือนว่าจะใช้งานไม่ได้ โค้ดต่อไปนี้ทำให้ out.gif
ใหญ่กว่า gif เริ่มต้น:
im = Image.open("my_gif.gif")
im.seek(im.tell() + 1) # loads all frames
im.save("out.gif", save_all=True, optimize=True, quality=10) # should decrease its quality
print(os.stat("my_gif.gif").st_size) # 2096558 bytes / roughly 2MB
print(os.stat("out.gif").st_size) # 7536404 bytes / roughly 7.5MB
หากฉันเพิ่มบรรทัดต่อไปนี้ ระบบจะบันทึกเฉพาะเฟรมแรกของ GIF เท่านั้น แทนที่จะเป็นเฟรมทั้งหมด
im = im.resize((im.size[0] // 2, im.size[1] // 2), Image.ANTIALIAS) # should decrease its size
ฉันกำลังคิดที่จะเรียก resize()
บน im.seek()
หรือ im.tell()
แต่ไม่มีวิธีใดที่ส่งคืนวัตถุ Image ดังนั้นฉันจึงไม่สามารถเรียก resize()
ในเอาต์พุตได้
คุณจะรู้ไหมว่าฉันสามารถใช้ Pillow เพื่อลดขนาด GIF ของฉันในขณะที่เก็บเฟรมทั้งหมดไว้ได้อย่างไร
[แก้ไข] วิธีแก้ปัญหาบางส่วน:
หลังจากคำตอบของ Old Bear ฉันได้ทำการเปลี่ยนแปลงต่อไปนี้แล้ว:
ฉันใช้ สคริปต์ของ BigglesZX เพื่อแยกเฟรมทั้งหมด โปรดทราบว่านี่คือสคริปต์ Python 2 และโปรเจ็กต์ของฉันเขียนด้วย Python 3 (ฉันได้พูดถึงรายละเอียดนั้นในตอนแรก แต่ได้รับการแก้ไขโดยชุมชน Stack Overflow) การรัน
2to3 -w gifextract.py
ทำให้สคริปต์นั้นเข้ากันได้กับ Python 3ฉันได้แยกแต่ละเฟรมแยกกัน:
frame.resize((frame.size[0] // 2, frame.size[1] // 2), Image.ANTIALIAS)
ฉันบันทึกเฟรมทั้งหมดไว้ด้วยกัน:
img.save("out.gif", save_all=True, optimize=True)
ตอนนี้ gif ใหม่ได้รับการบันทึกและใช้งานได้แล้ว แต่มีปัญหาหลัก 2 ประการ:
ฉันไม่แน่ใจว่าวิธีการปรับขนาดใช้งานได้ เนื่องจาก
out.gif
ยังคงเป็น 7.5MB GIF เริ่มต้นคือ 2MBความเร็ว GIF เพิ่มขึ้น และ GIF ไม่วนซ้ำ มันหยุดหลังจากการวิ่งครั้งแรก
ตัวอย่าง:
gif ต้นฉบับ my_gif.gif
:
Gif หลังการประมวลผล (out.gif
) https://i.imgur.com/zDO4cE4.mp4 (I ไม่สามารถเพิ่มลงใน Stack Overflow ได้) Imgur ทำให้ช้าลง (และแปลงเป็น mp4) เมื่อฉันเปิดไฟล์ GIF จากคอมพิวเตอร์ GIF ทั้งหมดจะใช้เวลาประมาณ 1.5 วินาที