mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-11-10 19:56:47 +03:00
4f185329f4
This adds a new test decorator: skip_unless_feature(). The argument is the same as passed to features.check(). If the feature is not supported, the test will be skipped. This removes several kinds of boilerplate copied and pasted around tests so test feature checking is handled and displayed more consistently. Refs #4193
95 lines
3.2 KiB
Python
95 lines
3.2 KiB
Python
from PIL import Image, ImageSequence, TiffImagePlugin
|
|
|
|
from .helper import PillowTestCase, assert_image_equal, hopper, skip_unless_feature
|
|
|
|
|
|
class TestImageSequence(PillowTestCase):
|
|
def test_sanity(self):
|
|
|
|
test_file = self.tempfile("temp.im")
|
|
|
|
im = hopper("RGB")
|
|
im.save(test_file)
|
|
|
|
seq = ImageSequence.Iterator(im)
|
|
|
|
index = 0
|
|
for frame in seq:
|
|
assert_image_equal(im, frame)
|
|
self.assertEqual(im.tell(), index)
|
|
index += 1
|
|
|
|
self.assertEqual(index, 1)
|
|
|
|
self.assertRaises(AttributeError, ImageSequence.Iterator, 0)
|
|
|
|
def test_iterator(self):
|
|
with Image.open("Tests/images/multipage.tiff") as im:
|
|
i = ImageSequence.Iterator(im)
|
|
for index in range(0, im.n_frames):
|
|
self.assertEqual(i[index], next(i))
|
|
self.assertRaises(IndexError, lambda: i[index + 1])
|
|
self.assertRaises(StopIteration, next, i)
|
|
|
|
def test_iterator_min_frame(self):
|
|
with Image.open("Tests/images/hopper.psd") as im:
|
|
i = ImageSequence.Iterator(im)
|
|
for index in range(1, im.n_frames):
|
|
self.assertEqual(i[index], next(i))
|
|
|
|
def _test_multipage_tiff(self):
|
|
with Image.open("Tests/images/multipage.tiff") as im:
|
|
for index, frame in enumerate(ImageSequence.Iterator(im)):
|
|
frame.load()
|
|
self.assertEqual(index, im.tell())
|
|
frame.convert("RGB")
|
|
|
|
def test_tiff(self):
|
|
self._test_multipage_tiff()
|
|
|
|
@skip_unless_feature("libtiff")
|
|
def test_libtiff(self):
|
|
TiffImagePlugin.READ_LIBTIFF = True
|
|
self._test_multipage_tiff()
|
|
TiffImagePlugin.READ_LIBTIFF = False
|
|
|
|
def test_consecutive(self):
|
|
with Image.open("Tests/images/multipage.tiff") as im:
|
|
firstFrame = None
|
|
for frame in ImageSequence.Iterator(im):
|
|
if firstFrame is None:
|
|
firstFrame = frame.copy()
|
|
for frame in ImageSequence.Iterator(im):
|
|
assert_image_equal(frame, firstFrame)
|
|
break
|
|
|
|
def test_palette_mmap(self):
|
|
# Using mmap in ImageFile can require to reload the palette.
|
|
with Image.open("Tests/images/multipage-mmap.tiff") as im:
|
|
color1 = im.getpalette()[0:3]
|
|
im.seek(0)
|
|
color2 = im.getpalette()[0:3]
|
|
self.assertEqual(color1, color2)
|
|
|
|
def test_all_frames(self):
|
|
# Test a single image
|
|
with Image.open("Tests/images/iss634.gif") as im:
|
|
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)
|
|
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)
|
|
assert_image_equal(im.rotate(90), im_frame)
|