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_all
aby 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]
animowany GIF - salty.gif
wynik - image.gif
If you like it
Buy a Coffee
Buy a Coffee