Saya memiliki gif
yang ingin saya ubah ukurannya dengan pillow
agar ukurannya mengecil. Ukuran gif
saat ini adalah 2MB.
Saya sedang mencoba
ubah ukurannya sehingga tinggi/lebarnya lebih kecil
menurunkan kualitasnya.
Dengan JPEG, potongan kode berikut biasanya cukup untuk membuat ukuran gambar besar berkurang secara drastis.
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
Namun, dengan GIF, sepertinya ini tidak berfungsi. Potongan kode berikut bahkan membuat out.gif
lebih besar dari gif awal:
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
Jika saya menambahkan baris berikut, maka hanya bingkai pertama GIF yang disimpan, bukan seluruh bingkainya.
im = im.resize((im.size[0] // 2, im.size[1] // 2), Image.ANTIALIAS) # should decrease its size
Saya telah berpikir untuk memanggil resize()
pada im.seek()
atau im.tell()
tetapi tidak satu pun dari metode ini yang mengembalikan objek Gambar, dan oleh karena itu saya tidak dapat memanggil resize()
pada keluarannya.
Tahukah Anda bagaimana saya bisa menggunakan Pillow untuk memperkecil ukuran GIF saya sambil mempertahankan semua bingkainya?
[sunting] Solusi parsial:
Mengikuti tanggapan Beruang Tua, saya telah melakukan perubahan berikut:
Saya menggunakan skrip BigglesZX untuk mengekstrak semua bingkai. Penting untuk dicatat bahwa ini adalah skrip Python 2, dan proyek saya ditulis dengan Python 3 (saya memang menyebutkan detail itu pada awalnya, tetapi telah diedit oleh Komunitas Stack Overflow). Menjalankan
2to3 -w gifextract.py
membuat skrip tersebut kompatibel dengan Python 3.Saya telah mengubah ukuran setiap frame satu per satu:
frame.resize((frame.size[0] // 2, frame.size[1] // 2), Image.ANTIALIAS)
Saya telah menyimpan semua frame bersama-sama:
img.save("out.gif", save_all=True, optimize=True)
.
GIF baru sekarang telah disimpan dan berfungsi, tetapi ada 2 masalah utama :
Saya tidak yakin metode pengubahan ukuran berfungsi, karena
out.gif
masih 7,5 MB. GIF awal adalah 2MB.Kecepatan gif ditingkatkan dan gif tidak berputar. Itu berhenti setelah dijalankan pertama kali.
Contoh:
gif asli my_gif.gif
:
Gif setelah diproses (out.gif
) https://i.imgur.com/zDO4cE4.mp4 (I tidak dapat menambahkannya ke Stack Overflow). Imgur membuatnya lebih lambat (dan mengubahnya menjadi mp4). Saat saya membuka file gif dari komputer saya, keseluruhan gif berdurasi sekitar 1,5 detik.