PIL -Преобразование кадров GIF в JPG

Я попытался преобразовать 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

Но я на самом деле не знаю, почему моя прозрачность черная, а не белая Даже если я изменю палитру (, измените канал прозрачности на белый ). или используйте маску прозрачности, фон по-прежнему черный

16
задан Schinken 22 April 2012 в 17:15
поделиться