Python + Pillow + Images2Gif — неверный цвет GIF-кадров

Я использую следующий код, чтобы добавить водяной знак к анимированным изображениям GIF. Моя проблема в том, что все кадры GIF, кроме первого, имеют неправильные цвета. Вы знаете, как исправить цвет рамок? Спасибо.

def add_watermark(in_file, watermark_file, watermark_position, watermark_ratio, out_file, quality=85):
   img = Image.open(in_file)
   watermark_layer = Image.new('RGBA', img.size, (0,0,0,0))
   watermark_img = Image.open(watermark_file).convert('RGBA')
   watermark_img.thumbnail((img.size[0]/watermark_ratio, 1000), Image.ANTIALIAS)
   alpha = watermark_img.split()[3]
   alpha = ImageEnhance.Brightness(alpha).enhance(0.95)
   watermark_img.putalpha(alpha)
   watermark_layer.paste(watermark_img, count_watermark_position(img, watermark_img, watermark_position))
   frames = images2gif.readGifFromPIL(img, False)
   frames_out = []
   for frame in frames:
       frames_out.append(Image.composite(watermark_layer, frame, watermark_layer))
   images2gif.writeGif(out_file, frames_out, duration=0.5)

Чтобы завершить пример, я также предоставляю код вспомогательной функции:

def count_watermark_position(img, watermark, position):
   if position == 'right_bottom':
      return img.size[0] - watermark.size[0], img.size[1] - watermark.size[1]
   if position == 'center':
      return (img.size[0] - watermark.size[0])/2, (img.size[1] - watermark.size[1])/2
   if position == 'left_bottom':
       return 0, img.size[1] - watermark.size[1]
   if position == 'left_top':
       return 0, 0
   if position == 'right_top':
      return img.size[0] - watermark.size[0], 0
   raise AttributeError('Invalid position')

Исходный код images2gif, который я использовал - я немного изменил его, чтобы он работал с подушкой. См. комментарий в начале исходного кода.


person snakey    schedule 21.07.2015    source источник
comment
Не могли бы вы предоставить count_watermark_position()?   -  person adrianus    schedule 21.07.2015
comment
Я не знаком с images2gif, но есть ли разница, если вы конвертируете составные изображения в режим «RGB» или «P»?   -  person PM 2Ring    schedule 21.07.2015
comment
@adrianus Я добавил код функции к вопросу.   -  person snakey    schedule 21.07.2015
comment
@snakey Спасибо. Где взять images2gif.readGifFromPIL() или какую версию images2gif вы используете? Я скачал последнюю версию images2gif, но там нет такого метода. Я получаю его для работы с readGif() хотя...   -  person adrianus    schedule 21.07.2015
comment
@PM2Ring Если я изменю img = Image.open(in_file) на img = Image.open(in_file).convert("RGB"), похоже, что информация о кадрах будет потеряна, и результатом будет GIF только с первым кадром (не анимированным). То же самое происходит и с режимом «P». Похоже, я не могу преобразовать изображение перед использованием images2gif.   -  person snakey    schedule 21.07.2015
comment
@adrianus хорошая мысль, добавил ссылку на исходный код на вопрос. Я думаю, что метод readGifFromPIL такой же, как readGif, за исключением того, что он не принимает путь к изображению в качестве аргумента, а сам файл. Я также отредактировал код, чтобы он работал с подушкой (см. комментарий в исходном коде в начале).   -  person snakey    schedule 21.07.2015
comment
@snakey: я не предлагал вам преобразовывать входные данные. Но я подозреваю, что может иметь значение, если вы конвертируете составные изображения перед передачей их в images2gif.writeGif. Например frames_out.append(Image.composite(watermark_layer, frame, watermark_layer).convert(mode='RGB'))   -  person PM 2Ring    schedule 21.07.2015
comment
Очень странно, у меня получаются одни и те же черно-белые кадры для каждого кадра, кроме первого. Может ошибка в images2gif?   -  person adrianus    schedule 21.07.2015
comment
@PM2Ring Попробовал ваш пример. Проблема та же (первый кадр в норме, остальные нет - цветопередача немного отличается в зависимости от режима RGB или P)   -  person snakey    schedule 21.07.2015
comment
@adrianus есть обсуждение похожей проблемы, где images2gif не используется.   -  person snakey    schedule 21.07.2015