Skip to content

Commit 05849ca

Browse files
authored
Merge pull request #3714 from radarhere/tiff_frames
Improvements to TIFF is_animated and n_frames
2 parents d4ff547 + 0a877a5 commit 05849ca

2 files changed

Lines changed: 11 additions & 29 deletions

File tree

Tests/test_file_tiff.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,6 @@ def test_n_frames(self):
253253
['Tests/images/multipage-lastframe.tif', 1],
254254
['Tests/images/multipage.tiff', 3]
255255
]:
256-
# Test is_animated before n_frames
257-
im = Image.open(path)
258-
self.assertEqual(im.is_animated, n_frames != 1)
259-
260-
# Test is_animated after n_frames
261256
im = Image.open(path)
262257
self.assertEqual(im.n_frames, n_frames)
263258
self.assertEqual(im.is_animated, n_frames != 1)

src/PIL/TiffImagePlugin.py

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -985,7 +985,6 @@ def _open(self):
985985
self.__fp = self.fp
986986
self._frame_pos = []
987987
self._n_frames = None
988-
self._is_animated = None
989988

990989
if DEBUG:
991990
print("*** TiffImageFile._open ***")
@@ -999,29 +998,14 @@ def _open(self):
999998
def n_frames(self):
1000999
if self._n_frames is None:
10011000
current = self.tell()
1002-
try:
1003-
while True:
1004-
self._seek(self.tell() + 1)
1005-
except EOFError:
1006-
self._n_frames = self.tell() + 1
1001+
self._seek(len(self._frame_pos))
1002+
while self._n_frames is None:
1003+
self._seek(self.tell() + 1)
10071004
self.seek(current)
10081005
return self._n_frames
10091006

10101007
@property
10111008
def is_animated(self):
1012-
if self._is_animated is None:
1013-
if self._n_frames is not None:
1014-
self._is_animated = self._n_frames != 1
1015-
else:
1016-
current = self.tell()
1017-
1018-
try:
1019-
self.seek(1)
1020-
self._is_animated = True
1021-
except EOFError:
1022-
self._is_animated = False
1023-
1024-
self.seek(current)
10251009
return self._is_animated
10261010

10271011
def seek(self, frame):
@@ -1053,6 +1037,10 @@ def _seek(self, frame):
10531037
print("Loading tags, location: %s" % self.fp.tell())
10541038
self.tag_v2.load(self.fp)
10551039
self.__next = self.tag_v2.next
1040+
if self.__next == 0:
1041+
self._n_frames = frame + 1
1042+
if len(self._frame_pos) == 1:
1043+
self._is_animated = self.__next != 0
10561044
self.__frame += 1
10571045
self.fp.seek(self._frame_pos[frame])
10581046
self.tag_v2.load(self.fp)
@@ -1086,7 +1074,7 @@ def load(self):
10861074
def load_end(self):
10871075
# allow closing if we're on the first frame, there's no next
10881076
# This is the ImageFile.load path only, libtiff specific below.
1089-
if len(self._frame_pos) == 1 and not self.__next:
1077+
if not self._is_animated:
10901078
self._close_exclusive_fp_after_loading = True
10911079

10921080
def _load_libtiff(self):
@@ -1166,10 +1154,9 @@ def _load_libtiff(self):
11661154
self.tile = []
11671155
self.readonly = 0
11681156
# libtiff closed the fp in a, we need to close self.fp, if possible
1169-
if self._exclusive_fp:
1170-
if len(self._frame_pos) == 1 and not self.__next:
1171-
self.fp.close()
1172-
self.fp = None # might be shared
1157+
if self._exclusive_fp and not self._is_animated:
1158+
self.fp.close()
1159+
self.fp = None # might be shared
11731160

11741161
if err < 0:
11751162
raise IOError(err)

0 commit comments

Comments
 (0)