Skip to content

Commit

Permalink
Added ImageSequence all_frames
Browse files Browse the repository at this point in the history
  • Loading branch information
radarhere committed Apr 8, 2019
1 parent e8b2da5 commit 32d118d
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
22 changes: 22 additions & 0 deletions Tests/test_imagesequence.py
Expand Up @@ -69,3 +69,25 @@ def test_palette_mmap(self):
im.seek(0)
color2 = im.getpalette()[0:3]
self.assertEqual(color1, color2)

def test_all_frames(self):
# Test a single image
im = Image.open('Tests/images/iss634.gif')
ims = ImageSequence.all_frames(im)

self.assertEqual(len(ims), 42)
for i, im_frame in enumerate(ims):
self.assertFalse(im_frame is im)

im.seek(i)
self.assert_image_equal(im, im_frame)

# Test a series of images
ims = ImageSequence.all_frames([im, hopper(), im])
self.assertEqual(len(ims), 85)

# Test an operation
ims = ImageSequence.all_frames(im, lambda im_frame: im_frame.rotate(90))
for i, im_frame in enumerate(ims):
im.seek(i)
self.assert_image_equal(im.rotate(90), im_frame)
22 changes: 22 additions & 0 deletions src/PIL/ImageSequence.py
Expand Up @@ -54,3 +54,25 @@ def __next__(self):

def next(self):
return self.__next__()


def all_frames(im, func=None):
"""
Applies a given function to all frames in an image or a list of images.
The frames are returned as a list of separate images.
:param im: An image, or a list of images.
:param func: The function to apply to all of the image frames.
:returns: A list of images.
"""
if not isinstance(im, list):
im = [im]

ims = []
for imSequence in im:
current = imSequence.tell()

ims += [im_frame.copy() for im_frame in Iterator(imSequence)]

imSequence.seek(current)
return [func(im) for im in ims] if func else ims

0 comments on commit 32d118d

Please sign in to comment.