使用枕头时如何去除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
:
这是你想要的吗?
我正在尝试在图像之上显示 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
:
这是你想要的吗?