我尝试用Python Imaging 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
但是它会产生奇怪的输出文件:
示例1 http://longcat.de/gif_example1.jpg
我的第二个尝试是先将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
这将导致输出如下:
示例#2 http://longcat.de/gif_example2.jpg
与第一次尝试相比,优点是第一帧看起来很好。但是正如您所见,其余部分已经损坏。
接下来我应该尝试什么?
编辑:
我认为我已经更接近解决方案了:
示例#3 http://longcat.de/gif_example3.png
我不得不使用第一张图片的调色板,并将其与前一帧合并(对于使用差异图像的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
我不知道为什么我的透明度是黑色而不是白色,即使我修改调色板(将透明通道改为白色)或使用透明度掩码,背景仍然是黑色。