Skip to content

Commit 87b1f29

Browse files
authored
Merge pull request #60 from makermelissa/master
Implemented suggested improvements from guide moderation
2 parents 33cc921 + 4e46bcb commit 87b1f29

File tree

1 file changed

+20
-46
lines changed

1 file changed

+20
-46
lines changed

examples/rgb_display_pillow_animated_gif.py

+20-46
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import time
1616
import digitalio
1717
import board
18-
from PIL import Image, ImageDraw
18+
from PIL import Image, ImageOps
1919
import adafruit_rgb_display.ili9341 as ili9341
2020
import adafruit_rgb_display.st7789 as st7789 # pylint: disable=unused-import
2121
import adafruit_rgb_display.hx8357 as hx8357 # pylint: disable=unused-import
@@ -59,36 +59,26 @@ def __init__(self, display, width=None, height=None, folder=None):
5959
if width is not None:
6060
self._width = width
6161
else:
62-
self._width = disp.width
62+
self._width = display.width
6363
if height is not None:
6464
self._height = height
6565
else:
66-
self._height = disp.height
66+
self._height = display.height
6767
self.display = display
6868
self.advance_button = init_button(BUTTON_NEXT)
6969
self.back_button = init_button(BUTTON_PREVIOUS)
7070
if folder is not None:
7171
self.load_files(folder)
7272
self.run()
7373

74-
def advance(self, loop=False):
75-
initial_index = self._index
76-
if self._index < len(self._gif_files) - 1:
77-
self._index += 1
78-
elif loop and self._index == len(self._gif_files) - 1:
79-
self._index = 0
80-
return initial_index != self._index
81-
82-
def back(self, loop=False):
83-
initial_index = self._index
84-
if self._index > 0:
85-
self._index -= 1
86-
elif loop and self._index == 0:
87-
self._index = len(self._gif_files) - 1
88-
return initial_index != self._index
74+
def advance(self):
75+
self._index = (self._index + 1) % len(self._gif_files)
76+
77+
def back(self):
78+
self._index = (self._index - 1 + len(self._gif_files)) % len(self._gif_files)
8979

9080
def load_files(self, folder):
91-
gif_files = [f for f in os.listdir(folder) if f[-4:] == '.gif']
81+
gif_files = [f for f in os.listdir(folder) if f.endswith('.gif')]
9282
for gif_file in gif_files:
9383
image = Image.open(gif_file)
9484
# Only add animated Gifs
@@ -112,15 +102,6 @@ def preload(self):
112102
else:
113103
self._loop = 1
114104
self._frame_count = image.n_frames
115-
screen_ratio = self._width / self._height
116-
image_ratio = image.width / image.height
117-
if screen_ratio > image_ratio:
118-
scaled_width = image.width * self._height // image.height
119-
scaled_height = self._height
120-
else:
121-
scaled_width = self._width
122-
scaled_height = image.height * self._width // image.width
123-
124105
self._frames.clear()
125106
for frame in range(self._frame_count):
126107
image.seek(frame)
@@ -129,18 +110,11 @@ def preload(self):
129110
frame_object = Frame(duration=self._duration)
130111
if "duration" in image.info:
131112
frame_object.duration = image.info['duration']
132-
frame_object.image = Image.new('RGB', (self._width, self._height))
133-
134-
# Get drawing object to draw on image.
135-
draw = ImageDraw.Draw(frame_object.image)
136-
draw.rectangle((0, 0, self._width, self._height), outline=0, fill=(0, 0, 0))
137-
138-
frame_image = image.copy()
139-
frame_image = frame_image.resize((scaled_width, scaled_height), Image.BICUBIC)
140-
x = scaled_width // 2 - self._width // 2
141-
y = scaled_height // 2 - self._height // 2
142-
frame_image = frame_image.crop((x, y, x + self._width, y + self._height))
143-
frame_object.image.paste(frame_image)
113+
frame_object.image = ImageOps.pad(image.convert("RGB"),
114+
(self._width, self._height),
115+
method=Image.NEAREST,
116+
color=(0, 0, 0),
117+
centering=(0.5, 0.5))
144118
self._frames.append(frame_object)
145119

146120
def play(self):
@@ -154,11 +128,11 @@ def play(self):
154128
for frame_object in self._frames:
155129
self.display.image(frame_object.image)
156130
if not self.advance_button.value:
157-
if self.advance():
158-
return False
159-
elif not self.back_button.value:
160-
if self.back():
161-
return False
131+
self.advance()
132+
return False
133+
if not self.back_button.value:
134+
self.back()
135+
return False
162136
time.sleep(frame_object.duration / 1000)
163137

164138
if self._loop == 1:
@@ -170,7 +144,7 @@ def run(self):
170144
while True:
171145
auto_advance = self.play()
172146
if auto_advance:
173-
self.advance(True)
147+
self.advance()
174148

175149
# Config for display baudrate (default max is 64mhz):
176150
BAUDRATE = 64000000

0 commit comments

Comments
 (0)