Работа с анимированными gif изображениями в Python 3

С обычными изображениями в питоне работают, как правило, с помощью модуля PIL, но, к сожалению, работать с анимированными гифками не так просто, как с обычными картинками.

В первую очередь, для того чтобы работать с гиф анимациями надо поставить два модуля. Первый модуль – Pillow (его можно скачать, например, здесь). Этот модуль является форком PIL и, в отличие от родителя, поддерживает Python 3. Он нам понадобиться для получения свойств гиф анимации, работы с отдельными кадрами и для того чтобы работал второй модуль. Второй – images2gif. Он нужен для чтения и записи анимированных гифок.

Прежде чем обработать гифку, необходимо её прочитать. Для начала, надо узнать её свойства. С помощью функции Image.open () из Pillow можно узнать следующие свойства анимированного файла, которые лежат в члене info (который является словарём) объекта изображения:

  • background – цвет фона по умолчанию в виде индекса цвета из палитры изображения.
  • duration – время между кадрами в миллисекундах.
  • transparency – индекс прозрачного цвета в палитре. Если прозрачных пикселей в гифке нет, то этот ключ не установлен.
  • version – версия формата (либо “GIF87a”, либо “GIF89a”).

Свойства можно получить вот так:

1
2
3
4
5
6
from PIL import Image

image_properties = Image.open("test_img.gif", "r")

duration = image_properties.info["duration"]
transparency = image_properties.info.get("transperency", None)

Для того чтобы работать с фреймами, их надо прочитать. Сделать это можно благодаря images2gif вот так:

1
2
3
import images2gif

frames = images2gif.readGif(gif_image, False)

Здесь список фреймов состоит из объектов изображений модуля Pillow. Их можно обрабатывать средствами Pillow как обычные изображения.
Ну и наконец, последовательность кадров можно сохранить в гиф анимацию вот так:

1
images2gif.writeGif("result.gif", frames, duration=0.1)

Здесь записывается список кадров frames в файл с именем «result.gif». Скорость воспроизведения задаётся параметром duration в секундах, в данном случае я указал время между сменой кадров в 100 миллисекунд.

Метки: , , , , , ,
Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Напишите комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *