PIL - Convert GIF Frames to JPG

匿名 (未验证) 提交于 2019-12-03 02:14:01

问题:

I tried to convert an gif to single images with Python Image Library, but it results in weird frames

The Input gif is:

Source Image http://longcat.de/gif_example.gif

In my first try, i tried to convert the image with Image.new to an RGB image, with 255,255,255 as white background - like in any other example i've found on the internet:

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

but it results in weird output files:

Example #1 http://longcat.de/gif_example1.jpg

My second try was, to convert the gif in an RGBA first, and then use its transparency mask, to make the transparent pieces white:

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

which results in an output like this:

Example #2 http://longcat.de/gif_example2.jpg

The advantage over the first try was, that the first frame looks pretty good But as you can see, the rest is broken

What should i try next?

Edit:

I think i came a lot closer to the solution

Example #3 http://longcat.de/gif_example3.png

I had to use the palette of the first image for the other images, and merge it with the previous frame (for gif animations which use 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         
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!