Библиотека Pillow — GIF искажается при зацикливании на gif и вставке в него другого изображения

#python #python-imaging-library #gif

#python #python-imaging-library #gif

Вопрос:

Я работаю с библиотекой Pillow. У меня есть один gif, на который я должен вставить другое изображение. При зацикливании на каждом кадре gif и вставке в него изображения gif искажается.

Кто-нибудь, пожалуйста, предложите правильное решение для этого.

Спасибо.

1. GIF

введите описание изображения здесь

2. Изображение

введите описание изображения здесь

3. Код

 from PIL import Image
from io import BytesIO

animated_gif = './img/gif_distort.gif'
transparent_foreground = './img/cat.jpeg'

img = Image.open(animated_gif)
image = Image.open(transparent_foreground)

duration = []
frames = []

for i in range(img.n_frames):
    img.seek(i)
    frame = img.convert('RGBA').copy()
    duration.append(img.info['duration'])
    frame.paste(image)
    frames.append(frame)

# save gif in temp file
temp_gif_path = 'img/output.gif'
frames[0].save(temp_gif_path, format='GIF', save_all=True, append_images=frames[1:], duration=duration, optimise=True)
  

Результат

введите описание изображения здесь

Комментарии:

1. Похоже, это ошибка в Pillow. Если вы вызываете getpalette() каждый кадр, кажется, предполагается, что палитра одинакова для всех кадров, тогда как изображение на самом деле имеет разную палитру для каждого кадра.

2. Я отправил проблему на Github github.com/python-pillow/Pillow/issues/4977

3. Я создал запрос на извлечение, чтобы исправить это — github.com/python-pillow/Pillow/pull/5857

4. Эта проблема будет решена с версии Pillow 9.0.0, выпущенной 1 января.