PIL-将GIF帧转换为JPG
image-processing
python
python-imaging-library
5
0

我试图用Python图像库将gif转换为单个图像,但结果导致帧怪异

输入gif为:

源图像http://longcat.de/gif_example.gif

在我的第一次尝试中,我尝试将Image.new的图像转换为255,255,255作为白色背景的RGB图像-就像在互联网上找到的任何其他示例一样:

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

但它导致输出文件奇怪:

Example#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

结果是这样的:

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

与第一次尝试相比的优势在于,第一帧看起来不错,但是正如您所看到的,其余帧都坏了

接下来我应该尝试什么?

编辑:

我想我离解决方案更近了

Example#3 http://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

但是我实际上不知道为什么我的透明度是黑色而不是白色,即使我修改了调色板(将透明度通道更改为白色)或使用了透明蒙版,背景仍然是黑色

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

在图像查看器上查看图像时,即使将透明度设置为零,它也倾向于将图像显示为黑色。确保图像真正透明的一种方法是将其合并到另一图像上。应当在不妨碍其他图像的情况下看到``图释''。

background = Image.open('someimage.jpg') #an existing image
foreground = Image.open('foo.jpg') #one of the above images
background.paste(foreground, (0,0), foreground)
background.save('trial.jpg') #the composite image

从理论上讲,如果在图像查看器中打开“ trial.jpg”,并且原始图像的内容被保留,并且在其顶部放置的是foo图像,那么您将确定它是否只是图像查看器,并且您的图像是否正常...

收藏
评论

首先, JPEG不支持透明度!但这不是唯一的问题。当您移至GIF的下一帧时, palette信息会丢失( 问题PIL吗? )-因此PIL无法正确转换为RGBA框架(因此,第一帧还可以,但是所有其他都是螺丝钉)。因此,解决方法是为每帧添加回palette (这是您在上一个代码示例中所做的,但是您的麻烦是您将其另存为RGB而不是RGBA因此没有alpha /透明通道。另外,您正在做一些不必要的事情。无论如何,这是.png的透明性和更正后的代码,希望它能有所用:)

在此处输入图片说明在此处输入图片说明在此处输入图片说明在此处输入图片说明在此处输入图片说明在此处输入图片说明在此处输入图片说明在此处输入图片说明在此处输入图片说明在此处输入图片说明

import Image
import sys

def processImage(infile):
    try:
        im = Image.open(infile)
    except IOError:
        print "Cant load", infile
        sys.exit(1)
    i = 0
    mypalette = im.getpalette()

    try:
        while 1:
            im.putpalette(mypalette)
            new_im = Image.new("RGBA", im.size)
            new_im.paste(im)
            new_im.save('foo'+str(i)+'.png')

            i += 1
            im.seek(im.tell() + 1)

    except EOFError:
        pass # end of sequence

processImage('gif_example.gif')
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号