Imageio в Python: сжатие GIF

Есть ли способ сжать GIF, делая это с imageio в python? Я делаю GIF с около 200 изображений, и окончательный файл составляет 30 МБ. Я бы предпочел, если это 5-10 МБ. В любом случае, изображения являются одноцветными, поэтому их следует хорошо сжать. Есть ли инструмент, который я могу использовать или указать его imageio?

Вот мой код, чтобы сделать GIF:

import os
import imageio as io
import re
#############################################################
#key to sort the file_names in order
numbers = re.compile(r'(\d+)')
def numericalSort(value):
    parts = numbers.split(value)
    parts[1::2] = map(int, parts[1::2])
    return parts
############################################################
file_names = sorted((fn for fn in os.listdir('.') if fn.startswith('surface')), key = numericalSort)

#gif writer
with io.get_writer('python_growth.gif', mode='I', duration=0.1) as writer:
    for filename in file_names:
        image = io.imread(filename)
        writer.append_data(image)

2 ответа

Столкнувшись ту же самую проблему, я создал оболочку для gifsicle библиотеки под названием pygifsicle и можно использовать его следующим образом:

from pygifsicle import optimize
optimize("path_to_my_gif.gif")

Как и любой другой пакет в pip, его можно установить, запустив:

pip install pygifsicle

Полный пример использования этой библиотеки доступен в документации imageio.

При установке pygifsicle вы также автоматически установите, если вы используете MacOS, библиотеку gifsicle с помощью Brew. Для других систем будет предоставлено пошаговое руководство, в котором в основном просто предлагается установить библиотеку через apt-get в Debian / Ubuntu (поскольку кажется хорошей идеей не запрашивать sudo в настройке пакета):

sudo apt-get install gifsicle

Или на windows вы можете установить один из доступных портов.

Другой метод - изменить размер и снизить качество изображения перед созданием гифки.

      from PIL import Image
# Resizing
image.resize((x, y), Image.ANTIALIAS)
# Reducing Quality
quality_val = 90
image.save(filename, 'JPEG', quality=quality_val)

Полный код для превращения изображений в сжатые gif

      from PIL import Image
import glob
x = 250
y = 250
fp_in = 'path/to/images'
fp_in = 'path/to/gif/output'
q = 50 # Quality
img, *imgs = [Image.open(f).resize((x,y),Image.ANTIALIAS) for f in sorted(glob.glob(fp_in))] 
img.save(fp=fp_out, format='GIF', append_images=imgs,quality=q, 
         save_all=True, duration=15, loop=0, optimize=True)
Другие вопросы по тегам