Цель: каждый кадр в конце должен иметь полное sudowoodo. Все, что не подходит, должно быть прозрачным в gif (мне бы тоже было хорошо с белым). Моя конечная цель - перекрасить его, поэтому я должен различать guish фон и покемона.
Я использую запросы, чтобы получить gif с веб-сайта а затем подушка, чтобы получить кадры. Когда я просматриваю кадры, артефакты (в основном фоновые) мешают моему методу избавления. Я использую https://ezgif.com/split, чтобы проверить, как это должно выглядеть.
Я поместил рамку, метод утилизации и рамки вокруг экстентов утилизации для своих коллажей, чтобы понять, как он должен складываться (показано на изображение ниже). Внизу приведен пример кода, который покажет восстановленные кадры.
Так как мне правильно получить чистые кадры с помощью подушки?
Изображения
Примечание:
- Для рамки кадра индекс 4 получает белую линию в теле, а индекс кадра 27 имеет зеленый фон. И несколько кадров не хватает зеленого цвета в сферах / ветвях.
- Чтобы ezgif.com увидел опубликованную мной фотографию, нужно поставить «Игнорировать оптимизации», но мне нужна конечная фотография, которая отображается на веб-сайте «Перерисовать каждый кадр с деталями из предыдущих кадров». '.
Используемый рисунок: https://play.pokemonshowdown.com/sprites/xyani/sudowoodo.gif
Результаты подушки:
![Pillow Extracted Frames](https://i.stack.imgur.com/hZMVw.png)
Результаты Эзгифа:
![Websites extraction](https://i.stack.imgur.com/xgpgX.png)
Код
Python Версии
Python == 3,6 .4
Подушка == 7.0.0
запросы == 2.23.0
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO
import requests
#Depends on the dispose_method and disposal_extent will process accordingly
def method_dispose(i, frames, previous_frame):
# 0 PIL = Overlay and pass
# 1 PIL = Overlay and return previous
# 2 PIL = Erase Overlay
new_frame = previous_frame.copy()
current_frame = frames.convert('RGBA')
new_frame.alpha_composite(current_frame, dest=frames.dispose_extent[0:2], source=frames.dispose_extent)
if frames.disposal_method is 0:
return new_frame, Image.new('RGBA', box=frames.size)
elif frames.disposal_method is 1:
return new_frame, new_frame.copy()
elif frames.disposal_method is 2:
draw = ImageDraw.Draw(previous_frame)
draw.rectangle(frames.dispose_extent, fill=(255, 255, 255, 0)) #fill white transparent
return new_frame, previous_frame.copy()
# Goes through the frames and pastes them next to each other then shows
def simpleCollage(frames, num_images_width : int = 5, num_images_height : int = 10):
width, height = frames.size
compilation = Image.new('RGBA', size=(width * num_images_width, height * num_images_height))
fnt = ImageFont.load_default().font
for i in range(frames.n_frames):
frames.seek(i)
the_frame = frames.convert('RGBA')
draw = ImageDraw.Draw(the_frame)
draw.rectangle(frames.dispose_extent, outline=(255,173,0,255))
draw.text((0,0), f"F{i}-M{frames.disposal_method}", font=fnt, fill=(255, 0, 0))
compilation.paste(the_frame, box=(width * int(i % num_images_width), height * int(i / num_images_width)))
if i == (num_images_width * num_images_height):
break;
compilation.show()
response = requests.get("https://play.pokemonshowdown.com/sprites/xyani/sudowoodo.gif")
frames = Image.open(BytesIO(response.content))
simpleCollage(frames)
width, height = frames.size
all_frames = []
pass_frame = Image.new('RGBA', size=frames.size)
for i in range(frames.n_frames):
frames.seek(i)
disp_frame, pass_frame = method_dispose(i, frames, pass_frame)
all_frames.append(disp_frame)
all_frames[0].save(fp="test.gif", format='GIF', save_all=True, append_images=all_frames[1:], optimize=False, duration=frames.info['duration'], loop=0)
simpleCollage(Image.open("test.gif"))
Некоторые источники, которые я использовал для метода утилизации: