Ответ 1
Если вы можете придерживаться ImageMagick, то это очень просто решить:
convert input.gif -coalesce output.png
В противном случае вам нужно будет рассмотреть различные формы того, как можно построить каждый кадр GIF. Для этого конкретного типа GIF, а также другого, показанного в вашем другом вопросе, работает следующий код (обратите внимание, что в вашем предыдущем вопросе принятый ответ фактически не делает все частичные части прозрачными - по крайней мере, с последними выпущен PIL):
import sys
from PIL import Image, ImageSequence
img = Image.open(sys.argv[1])
pal = img.getpalette()
prev = img.convert('RGBA')
prev_dispose = True
for i, frame in enumerate(ImageSequence.Iterator(img)):
dispose = frame.dispose
if frame.tile:
x0, y0, x1, y1 = frame.tile[0][1]
if not frame.palette.dirty:
frame.putpalette(pal)
frame = frame.crop((x0, y0, x1, y1))
bbox = (x0, y0, x1, y1)
else:
bbox = None
if dispose is None:
prev.paste(frame, bbox, frame.convert('RGBA'))
prev.save('foo%02d.png' % i)
prev_dispose = False
else:
if prev_dispose:
prev = Image.new('RGBA', img.size, (0, 0, 0, 0))
out = prev.copy()
out.paste(frame, bbox, frame.convert('RGBA'))
out.save('foo%02d.png' % i)
В конечном итоге вам придется воссоздать то, что делает -coalesce
, так как вполне вероятно, что указанный выше код может не работать с определенными изображениями GIF.