У меня есть gif
, размер которого я хотел бы изменить с помощью pillow
, чтобы его размер уменьшился. Текущий размер gif
- 2 МБ.
я пытаюсь
измените его размер, чтобы его высота / ширина были меньше
снизить его качество.
Для 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-файла, сохранив при этом все его кадры?
[править] Частичное решение:
Следуя ответу старого медведя, я внес следующие изменения:
Я использую скрипт BigglesZX для извлечения всех фреймов. Полезно отметить, что это сценарий Python 2, а мой проект написан на Python 3 (я упомянул эту деталь изначально, но она была отредактирована сообществом Stack Overflow Community). Запуск
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,5 МБ. Первоначальный размер гифки был 2 МБ.Скорость гифки увеличивается, и гифка не зацикливается. Он останавливается после первого запуска.
Пример:
оригинальный gif my_gif.gif
:
Gif после обработки (out.gif
) https://i.imgur.com/zDO4cE4.mp4 (I не смог добавить его в Stack Overflow). Imgur сделал его медленнее (и преобразовал в mp4). Когда я открываю gif-файл со своего компьютера, весь gif-файл длится около 1,5 секунд.