Я попытался преобразовать gif в отдельные изображения с помощью библиотеки изображений Python, но это приводит к странным кадрам
Входной gif:
Исходное изображениеhttp://longcat.de/gif_example.gif
В моей первой попытке я попытался преобразовать изображение с помощью Изображение 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
Моя вторая попытка заключалась в том, чтобы сначала преобразовать 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
Мне пришлось использовать палитру первого изображения для других изображений, и объединить его с предыдущим кадром (для анимаций gif, которые используют diff -images)
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
Но я на самом деле не знаю, почему моя прозрачность черная, а не белая Даже если я изменю палитру (, измените канал прозрачности на белый ). или используйте маску прозрачности, фон по-прежнему черный