Python Image Libraryを使用してgifを単一の画像に変換しようとしましたが、フレームがおかしくなります
入力gifは次のとおりです。
ソース画像http://longcat.de/gif_example.gif
私の最初の試みでは、Image.newを使用して画像をRGB画像に変換しようとしました。この画像は、インターネットで見つけた他の例のように、白地に255,255,255を使用しています。
def processImage( infile ):
try:
im = Image.open( infile )
except IOError:
print "Cant load", infile
sys.exit(1)
i = 0
try:
while 1:
background = Image.new("RGB", im.size, (255, 255, 255))
background.paste(im)
background.save('foo'+str(i)+'.jpg', 'JPEG', quality=80)
i += 1
im.seek( im.tell() + 1 )
except EOFError:
pass # end of sequence
しかし、それは奇妙な出力ファイルになります:
例1http://longcat.de/gif_example1.jpg
2番目の試みは、最初にgifをRGBAに変換し、次にその透明マスクを使用して、透明部分を白にすることでした。
def processImage( infile ):
try:
im = Image.open( infile )
except IOError:
print "Cant load", infile
sys.exit(1)
i = 0
try:
while 1:
im2 = im.convert('RGBA')
im2.load()
background = Image.new("RGB", im2.size, (255, 255, 255))
background.paste(im2, mask = im2.split()[3] )
background.save('foo'+str(i)+'.jpg', 'JPEG', quality=80)
i += 1
im.seek( im.tell() + 1 )
except EOFError:
pass # end of sequence
これにより、次のような出力が得られます。
例2http://longcat.de/gif_example2.jpg
最初の試行に対する利点は、最初のフレームがかなり見栄えがすることでしたが、ご覧のとおり、残りは壊れています
次に何を試すべきですか?
編集:
私は解決策にかなり近づいたと思います
例3http://longcat.de/gif_example3.png
他の画像には最初の画像のパレットを使用し、それを前のフレームとマージする必要がありました(diff-imagesを使用するgifアニメーションの場合)
def processImage( infile ):
try:
im = Image.open( infile )
except IOError:
print "Cant load", infile
sys.exit(1)
i = 0
size = im.size
lastframe = im.convert('RGBA')
mypalette = im.getpalette()
try:
while 1:
im2 = im.copy()
im2.putpalette( mypalette )
background = Image.new("RGB", size, (255,255,255))
background.paste( lastframe )
background.paste( im2 )
background.save('foo'+str(i)+'.png', 'PNG', quality=80)
lastframe = background
i += 1
im.seek( im.tell() + 1 )
except EOFError:
pass # end of sequence
しかし、実際には、透明度が白ではなく黒である理由がわかりません。パレットを変更したり(透明度チャネルを白に変更したり)、透明度マスクを使用しても、背景は黒のままです。