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 画像では機能しない可能性があるため、最終的には、何を行うかを再作成する必要があります。