-
Notifications
You must be signed in to change notification settings - Fork 0
/
animatedGIF.py
95 lines (82 loc) · 2.83 KB
/
animatedGIF.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
from PIL import Image, ImageOps
import os
import time
class Frame:
def __init__(self, duration=0):
self.duration = duration
self.image = None
class AnimatedGif:
def __init__(self, display, rotation, width=None, height=None, folder=None):
self.framecount = 0
#self.loop = 0
self.index = 0
self.duration = 0
self.frames = []
self.rotation = rotation
if width is not None:
self.width = width
else:
self.width = display.width
if height is not None:
self.height = height
else:
self.height = display.height
self.display = display
def preload(self, file):
image = Image.open(file)
print("Loading {}".format(file))
if "duration" in image.info:
self.duration = image.info["duration"]
else:
self.duration = 0
if "loop" in image.info:
self.loop = image.info["loop"]
else:
self.loop = 1
self.framecount = image.n_frames
self.frames.clear()
for i in range(self.framecount):
print("Loading frame {}".format(i))
image.seek(i)
# Create blank image for drawing.
# Make sure to create image with mode 'RGB' for full color.
frameobject = Frame(duration=self.duration)
if "duration" in image.info:
frameobject.duration = image.info["duration"]
f = image.convert("RGB")
# if self.rotation % 180 == 90:
# f = f.transpose(Image.ROTATE_90)
frameobject.image = ImageOps.pad( # pylint: disable=no-member
f,
((self.width, self.height) if self.rotation % 180 == 0 else (self.height, self.width)),
method=Image.Resampling.NEAREST,
color=(0, 0, 0),
centering=(0.5, 0.5),
)
self.frames.append(frameobject)
def play(self):
self.preload()
while True:
for frameobject in self.frames:
starttime = time.monotonic()
self.display.image(frameobject.image, self.rotation)
while time.monotonic() < (starttime + frameobject.duration / 1000):
pass
def postFrame(self):
frame = self.frames[self.index]
self.display.image(frame.image, self.rotation)
self.index += 1
if self.index >= self.framecount:
self.index = 0
return True # looped
return False #frame.duration
if __name__ == '__main__':
import displayEmulator
display = displayEmulator.DisplayEmulator()
display.begin()
logo = AnimatedGif(display)
logo.preload("out.gif")
while True:
#print('loop')
logo.postFrame()
time.sleep(0.1)