使用枕头时如何去除gif的白色背景?

How to remove white background of gif when using pillow?

我正在尝试在图像之上显示 gif。 gif 最初具有透明背景。下面的代码就是这样做的,除了它在原始 gif 周围创建了一个黑色背景,当 gif 重置时它会闪烁白色。如果我不调整 gif 的大小,那么在与图像合并后,原始 gif 周围仍然会有白色背景。

有没有办法在合并时保持原始 gif 的背景透明?

from PIL import Image


background = Image.open('GrassyField.png').convert("RGBA")
gif = Image.open("1.gif")

foreground_w, foreground_w = gif.size
background_w, background_h = background.size
frames = []

for num in range(gif.n_frames):
    gif.seek(num)
    layer = Image.new('RGBA', (foreground_w, foreground_w), (0, 0, 0, 0)).resize((background_w, 
        background_h))
    layer.paste(background, (0, 0), mask=background)

    layer.paste(gif.resize((100, 100)).convert('RGBA'), (220, 25))

    frames.append(layer)
    frames[0].save('output.gif',
            save_all=True,
            append_images=frames[1:],
            duration=100,loop=0)

假设 1.gif 是:

GrassyField.png是:

使用此代码:

import PIL.Image
import PIL.ImageSequence

with PIL.Image.open('1.gif') as foreground_animation, PIL.Image.open('GrassyField.png') as background_image:
    image_roles = {
        'foreground': foreground_animation, 
        'background': background_image.convert(mode='RGBA')
    }

    def create_frames(images_roles):
        for current_frame in PIL.ImageSequence.Iterator(image_roles['foreground']):
            current_background = image_roles['background'].copy()
            current_foreground = current_frame.convert(mode='RGBA').resize((100, 100))
            current_background.alpha_composite(current_foreground, dest=(220,25))
            yield current_background

    frames = tuple(create_frames(image_roles))
    frames[0].save(
        'output.gif',
        save_all=True,
        append_images=frames[1:],
        duration=100,loop=0
    )

你得到 output.gif:

这是你想要的吗?