Merge pull request #2674 from radarhere/fli

Use frame count from FLI header
This commit is contained in:
wiredfool 2017-08-16 15:13:27 +01:00 committed by GitHub
commit 1d416c58e5
2 changed files with 28 additions and 29 deletions

View File

@ -49,6 +49,9 @@ class FliImageFile(ImageFile.ImageFile):
s[20:22] == b"\x00\x00"): # reserved
raise SyntaxError("not an FLI/FLC file")
# frames
self.__framecount = i16(s[6:8])
# image characteristics
self.mode = "P"
self.size = i16(s[8:10]), i16(s[10:12])
@ -86,8 +89,6 @@ class FliImageFile(ImageFile.ImageFile):
self.__frame = -1
self.__fp = self.fp
self.__rewind = self.fp.tell()
self._n_frames = None
self._is_animated = None
self.seek(0)
def _palette(self, palette, shift):
@ -110,43 +111,22 @@ class FliImageFile(ImageFile.ImageFile):
@property
def n_frames(self):
if self._n_frames is None:
current = self.tell()
try:
while True:
self.seek(self.tell() + 1)
except EOFError:
self._n_frames = self.tell() + 1
self.seek(current)
return self._n_frames
return self.__framecount
@property
def is_animated(self):
if self._is_animated is None:
current = self.tell()
try:
self.seek(1)
self._is_animated = True
except EOFError:
self._is_animated = False
self.seek(current)
return self._is_animated
return self.__framecount > 1
def seek(self, frame):
if frame == self.__frame:
return
if frame < self.__frame:
self._seek(0)
if frame >= self.__framecount:
raise EOFError("no more images in FLI file")
last_frame = self.__frame
for f in range(self.__frame + 1, frame + 1):
try:
self._seek(f)
except EOFError:
self.seek(last_frame)
raise EOFError("no more images in FLI file")
self._seek(f)
def _seek(self, frame):
if frame == 0:

View File

@ -27,6 +27,16 @@ class TestFileFli(PillowTestCase):
self.assertEqual(im.info["duration"], 71)
self.assertTrue(im.is_animated)
def test_tell(self):
# Arrange
im = Image.open(static_test_file)
# Act
frame = im.tell()
# Assert
self.assertEqual(frame, 0)
def test_invalid_file(self):
invalid_file = "Tests/images/flower.jpg"
@ -39,7 +49,7 @@ class TestFileFli(PillowTestCase):
self.assertFalse(im.is_animated)
im = Image.open(animated_test_file)
self.assertEqual(im.n_frames, 385)
self.assertEqual(im.n_frames, 384)
self.assertTrue(im.is_animated)
def test_eoferror(self):
@ -54,6 +64,15 @@ class TestFileFli(PillowTestCase):
except EOFError:
self.assertLess(im.tell(), n_frames)
def test_seek_outside(self):
# Test negative seek
im = Image.open(static_test_file)
im.seek(-1)
self.assertEqual(im.tell(), 0)
# Test seek past end of file
self.assertRaises(EOFError, lambda: im.seek(2))
def test_seek_tell(self):
im = Image.open(animated_test_file)