使用 Python PIL 库将 GIF 放在 PNG 前面

Place GIF in front of a PNG with Python PIL library

我正在尝试使用 Python 3 和 PIL 库将 PNG 文件与 GIF 文件合并。

我想将 PNG 文件放在背景中,而 foreground.I 中的 GIF 文件可以做相反的事情,将 GIF 文件放在背景中,将 PNG 文件放在前景中。感谢在这里回答的人: 然而,当我尝试做我需要的事情时,我只得到透明的 GIF 而没有图像背景上的 PNG。

我用这个透明 GIF:https://i.imgur.com/wOolptS.gif

我使用这个 PNG:https://i.imgur.com/kfnQGYP.png

我得到这个输出:https://i.imgur.com/rtWYKVn.gif

我的代码:

from PIL import Image

foreground = Image.open('image.gif')
background = Image.open('image.png').convert("RGBA")
img_w, img_h = background.size
foreground_w, foreground_w = foreground.size
if foreground.is_animated:
    frames = []
    for num in range(foreground.n_frames):
        foreground.seek(num)
        layer = Image.new('RGBA', (foreground_w, foreground_w), (0, 0, 0, 0)).resize((img_w, img_h))
        layer.paste(background, (0,0), mask=background)
        layer.paste(foreground.resize((img_w, img_h)), (0,0))
        frames.append(layer)
        frames[0].save('1.gif',
                    save_all=True,
                    append_images=frames[1:],
                    duration=100,loop=0)

即使您将其称为“透明 GIF”,但其中没有一个透明像素。调色板包含 16 种颜色,但每个帧的 99.99% 由前 2 个调色板条目组成。前 3 帧使用 4 种颜色,第 4 帧使用 6 种颜色。

如果 GIF 包含适当的透明度,一个简单的 over = foreground.convert('RGBA') 将为您提供具有 alpha 透明度的图像。