Skip to content

Commit 035d9ff

Browse files
authored
Merge pull request #668 from SmartBase-SK/master
Fix: Preserve loop attribute for animated images in processors
2 parents 208f672 + 4e1bb35 commit 035d9ff

2 files changed

Lines changed: 25 additions & 7 deletions

File tree

easy_thumbnails/processors.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ def apply_to_frames(self, method, *args, **kwargs):
5252
self.im.seek(i)
5353
new_frames.append(method(*args, **kwargs))
5454
write_to = BytesIO()
55+
loop = self.im.info.get('loop', 0)
5556
new_frames[0].save(
56-
write_to, format=self.im.format, save_all=True, append_images=new_frames[1:]
57+
write_to, format=self.im.format, save_all=True, append_images=new_frames[1:], loop=loop
5758
)
5859
return Image.open(write_to)
5960

@@ -104,6 +105,7 @@ def colorspace(im, bw=False, replace_alpha=False, **kwargs):
104105
im = base
105106
else:
106107
frames = []
108+
loop = im.info.get('loop', 0)
107109
for i in range(im.n_frames):
108110
im.seek(i)
109111
if im.mode != 'RGBA':
@@ -113,7 +115,7 @@ def colorspace(im, bw=False, replace_alpha=False, **kwargs):
113115
frames.append(base)
114116
write_to = BytesIO()
115117
frames[0].save(
116-
write_to, format=im.format, save_all=True, append_images=frames[1:]
118+
write_to, format=im.format, save_all=True, append_images=frames[1:], loop=loop
117119
)
118120
return Image.open(write_to)
119121
else:
@@ -376,13 +378,14 @@ def background(im, size, background=None, **kwargs):
376378
return new_im
377379
else:
378380
frames = []
381+
loop = im.info.get('loop', 0)
379382
for i in range(im.n_frames):
380383
im.seek(i)
381384
copied_new_im = new_im.copy()
382385
copied_new_im.paste(im, offset)
383386
frames.append(copied_new_im)
384387
write_to = BytesIO()
385388
frames[0].save(
386-
write_to, format=im.format, save_all=True, append_images=frames[1:]
389+
write_to, format=im.format, save_all=True, append_images=frames[1:], loop=loop
387390
)
388391
return Image.open(write_to)

easy_thumbnails/tests/test_animated_formats.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from unittest import TestCase
55

66

7-
def create_animated_image(mode='RGB', format="gif", size=(1000, 1000), no_frames=6):
7+
def create_animated_image(mode='RGB', format="gif", size=(1000, 1000), no_frames=6, loop=None):
88
frames = []
99
for i in range(no_frames):
1010
image = Image.new(mode, size, (255, 255, 255))
@@ -14,9 +14,10 @@ def create_animated_image(mode='RGB', format="gif", size=(1000, 1000), no_frames
1414
draw.rectangle((x_bit * 2, y_bit, x_bit * 3, y_bit * 8), 'yellow')
1515
frames.append(image)
1616
write_to = BytesIO()
17-
frames[0].save(
18-
write_to, format=format, save_all=True, append_images=frames[1:]
19-
)
17+
save_kwargs = {'format': format, 'save_all': True, 'append_images': frames[1:]}
18+
if loop is not None:
19+
save_kwargs['loop'] = loop
20+
frames[0].save(write_to, **save_kwargs)
2021
im = Image.open(write_to)
2122
# for debugging
2223
# with open(f"animated{no_frames}.{format}", "wb") as f:
@@ -81,3 +82,17 @@ def test_background(self):
8182
# indeed processed?
8283
self.assertEqual(frames_count, processed_frames_count)
8384
self.assertEqual(processed.size, (1000, 1800))
85+
86+
def test_background_loop_preserved(self):
87+
no_frames = 5
88+
loop_value = 3
89+
im = create_animated_image(format="gif", no_frames=no_frames, loop=loop_value)
90+
91+
original_loop = im.info.get('loop', 0)
92+
self.assertEqual(original_loop, loop_value)
93+
94+
processed = processors.background(im, background="#00ff00", size=(1200, 1200))
95+
96+
processed_loop = processed.info.get('loop', 0)
97+
self.assertEqual(processed_loop, original_loop)
98+
self.assertEqual(processed_loop, loop_value)

0 commit comments

Comments
 (0)