From 25e467a756d42d875de7f6a019ce36d8aa836c8a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 12 Aug 2017 12:11:36 +1000 Subject: [PATCH] Use frame count from FLI header --- PIL/FliImagePlugin.py | 38 +++++++++----------------------------- 1 file changed, 9 insertions(+), 29 deletions(-) diff --git a/PIL/FliImagePlugin.py b/PIL/FliImagePlugin.py index a2d0e0fab..94b82540a 100644 --- a/PIL/FliImagePlugin.py +++ b/PIL/FliImagePlugin.py @@ -38,7 +38,7 @@ class FliImageFile(ImageFile.ImageFile): format = "FLI" format_description = "Autodesk FLI/FLC Animation" _close_exclusive_fp_after_loading = False - + def _open(self): # HEAD @@ -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: