Как вы масштабируете анимированное GIF-изображение в PIL и сохраняете анимацию - PullRequest
6 голосов
/ 03 февраля 2012

Мне интересно, возможно ли масштабировать анимированное GIF-изображение с помощью PIL. В частности, архетипы Plone ImageField в настоящее время теряет анимацию из изображений, масштабированных с использованием метода масштабирования:

def scale(self, data, w, h, default_format = 'PNG'):
    """ scale image (with material from ImageTag_Hotfix)"""
    #make sure we have valid int's
    size = int(w), int(h)

    original_file=StringIO(data)
    image = PIL.Image.open(original_file)
    # consider image mode when scaling
    # source images can be mode '1','L,','P','RGB(A)'
    # convert to greyscale or RGBA before scaling
    # preserve palletted mode (but not pallette)
    # for palletted-only image formats, e.g. GIF
    # PNG compression is OK for RGBA thumbnails
    original_mode = image.mode
    img_format = image.format and image.format or default_format
    if original_mode == '1':
        image = image.convert('L')
    elif original_mode == 'P':
        image = image.convert('RGBA')
    image.thumbnail(size, self.pil_resize_algo)
    # decided to only preserve palletted mode
    # for GIF, could also use image.format in ('GIF','PNG')
    if original_mode == 'P' and img_format == 'GIF':
        image = image.convert('P')
    thumbnail_file = StringIO()
    # quality parameter doesn't affect lossless formats
    image.save(thumbnail_file, img_format, quality=self.pil_quality)
    thumbnail_file.seek(0)
    return thumbnail_file, img_format.lower()

Я знаю, как определить анимированный GIF: следующее значение соответствует True image.format == 'GIF' and image.seek(image.tell()+1). Я пытался не переходить в режим RGBA, но это не сработало.

Фон: в нашем экземпляре Plone мы изменили тип изображения по умолчанию, чтобы установить атрибут original_size его поля изображения, чтобы принудительно масштабировать все изображения с соответствующей настройкой качества. Это прекрасно работает для JPEG, но это означает, что в настоящее время мы не можем загружать анимированные GIF-файлы

Ответы [ 3 ]

7 голосов
/ 23 октября 2012

Вы можете использовать images2gif.py, чтобы читать картинки и затем масштабировать каждый кадр независимо.images2gif позволит вам написать анимированный GIF с последовательностью изображений.

Файл images2gif.py, который я нашел в интернете, не обрабатывал прозрачность, поэтому я исправил это.Вы можете найти это здесь: https://bitbucket.org/bench/images2gif.py

4 голосов
/ 03 февраля 2012

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

Я бы посоветовал попробовать другой метод масштабирования изображений, чем PIL, если вы хотите иметь дело с анимированными GIF-файлами.Возможно, самый простой способ - это использовать внепроцессный ImageMagick с subprocess.Popen - (и даже тогда, я полагаю, что в настоящее время ImageMagick «делает все правильно» с анимированными GIF-файлами) -

Можно выбрать «сервер обработки изображений» с другим скриптом Python, кроме вашей установки zope, которая будет получать запросы на масштабирование изображений - возможно, с помощью вызова xmlrpc - вы можете создать его как плагин GIMP и использоватьGIMP для масштабирования GIF.

Другой вариант - оставить все как есть и использовать «неподвижные» изображения для анимированных GIF, где они должны отображаться в другом измерении, чем оригинал, и отображать исходное изображение, где анимацияявляется целесообразным.(Или может просто потребовать, чтобы анимированные GIF-файлы были представлены уже в нужном размере)

0 голосов
/ 13 декабря 2016

Подушка (вилка PIL) поддерживает анимированный GIF с версии 3.0.0 , когда PR # 1384 было объединено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...