127 lines
3.0 KiB
Python
127 lines
3.0 KiB
Python
import os
|
|
from PIL import Image
|
|
import tempfile
|
|
|
|
|
|
class Video(object):
|
|
def __init__(self, framerate, width, height):
|
|
self.framerate = framerate
|
|
self.width = width
|
|
self.height = height
|
|
self.sprites = []
|
|
|
|
def add_sprite(self, sprite):
|
|
self.sprites.append(sprite)
|
|
|
|
def render(self, outpath):
|
|
"""
|
|
render the video to a file
|
|
|
|
for frame in frames:
|
|
canvas = image()
|
|
for sprite in sprites:
|
|
sprite.next_frame()
|
|
sprite.draw(canvas)
|
|
canvas.save(...)
|
|
|
|
ffmepeg()
|
|
"""
|
|
|
|
with tempfile.TemporaryDirectory() as tmpdir:
|
|
for framenum in range(0, 30):
|
|
canvas = Image.new('RGB', (self.width, self.height, ))
|
|
for sprite in self.sprites:
|
|
sprite.draw(canvas)
|
|
|
|
with open(os.path.join(tmpdir, "frame_{:08d}.png".format(framenum)), "wb") as f:
|
|
canvas.save(f, "PNG")
|
|
|
|
for sprite in self.sprites:
|
|
sprite.next_frame()
|
|
|
|
print("done!")
|
|
os.system("open {}".format(tmpdir))
|
|
input()
|
|
|
|
|
|
|
|
class Source(object):
|
|
def __init__(self, file_path):
|
|
self.file_path = file_path
|
|
self.load()
|
|
|
|
def load(self):
|
|
"""
|
|
load the media from disk
|
|
"""
|
|
raise NotImplementedError()
|
|
|
|
|
|
class Sprite(object):
|
|
def __init__(self, source, position=(0, 0)):
|
|
self.source = source
|
|
self.position = position
|
|
self.visible = False
|
|
self.animations = []
|
|
|
|
def add_animation(self, animation):
|
|
self.animations.append(animation)
|
|
|
|
#TODO transforms that can modify the image e.g. scale it
|
|
# also, AddTransformAnimation/RemoveTransformAnimation to make modifications on the fly
|
|
# also, TweenTransformationAnimation
|
|
# def add_transform(self, transform):
|
|
# pass
|
|
|
|
def get_pending_animations(self):
|
|
return self.animations#TODO
|
|
|
|
def next_frame(self):
|
|
for animation in self.get_pending_animations():
|
|
animation.apply(self)
|
|
|
|
def draw(self, canvas):
|
|
"""
|
|
Draw the sprite on top of the given canvas
|
|
"""
|
|
raise NotImplementedError()
|
|
|
|
|
|
class ImageSprite(Sprite):
|
|
def __init__(self, source, position=(0, 0)):
|
|
super().__init__(source, position)
|
|
|
|
def draw(self, canvas):
|
|
"""
|
|
Draw the sprite on top of the given canvas
|
|
"""
|
|
# raise NotImplementedError("xd")
|
|
# pass
|
|
canvas.paste(self.source.img, (0, 0))
|
|
|
|
|
|
class Animation(object):
|
|
# def __init__(self, path=None, filters=None, transforms=None, after=None):
|
|
# pass
|
|
|
|
def apply(self, sprite):
|
|
raise NotImplementedError()
|
|
|
|
|
|
class ImageSource(Source):
|
|
def load(self):
|
|
self.img = Image.open(self.file_path)
|
|
|
|
|
|
class VideoSource(Source):
|
|
pass
|
|
|
|
|
|
class ShowAnimation(Animation):
|
|
def apply(self, sprite):
|
|
sprite.visible = True
|
|
|
|
class HideAnimation(Animation):
|
|
def apply(self, sprite):
|
|
sprite.visible = False
|