如果您可以坚持使用 ImageMagick,那么解决此问题非常简单:
convert input.gif -coalesce output.png
否则,您将不得不考虑如何构建每个 GIF 帧的不同形式。对于这种特定类型的 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 图像。