Search on blog:

Pillow: Jak wstawić transparentny animowany gif na inny obraz?

To jest przykład jak pobrać animowany GIF i wstawić go na innym obrazku.

Kod używa ImageSequence do pobrania animacji klatka-po-klatce i wstawia je na powielane tło.

Ponieważ GIF ma transparentne tło więc trzeba klatki zamieniać na RGBA aby użyć kanał Alfa jako maskę transparentności.

Po stworzeniu wszystkich klatek bierze pierwszą klatkę do zapisu i dołącza pozostałe klatki za pomocą o Zapis wymage save_allaby zapisać wszystkie klatki w GIF. Wymaga on także loop=0 dla zapętlenia w niekończoność. Używając duration można zdecydować jak długo (w millisekundach) będą wyświetlane poszczególne klatki (1s = 1000ms).

from PIL import Image, ImageSequence

background   = Image.open('lenna.png')#.convert('RGBA')
animated_gif = Image.open("salty.gif")

all_frames = []

for gif_frame in ImageSequence.Iterator(animated_gif):

    # duplicate background image because we will change it (we will paste 
    new_frame = background.copy()

    # convert to `RGBA` to use `Alpha` in `paste` as transparency mask
    gif_frame = gif_frame.convert('RGBA')

    # paste on background with transparency mask (channel ALPHA in gif_frame)
    new_frame.paste(gif_frame, mask=gif_frame) 

    all_frames.append(new_frame)

# save first frame and append other frames with duration 100ms 
all_frames[0].save("image2.gif", save_all=True, append_images=all_frames[1:], duration=100, loop=0)

tło - lenna.png (wikipedia: Lenna]

python example

animowany GIF - salty.gif

python example

wynik - image.gif

python example
If you like it
Buy a Coffee