Skip to content

Commit f854676

Browse files
committed
Do not update images during n_frames or is_animated seeking
1 parent 590c616 commit f854676

1 file changed

Lines changed: 23 additions & 19 deletions

File tree

src/PIL/GifImagePlugin.py

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ def n_frames(self):
9797
current = self.tell()
9898
try:
9999
while True:
100-
self.seek(self.tell() + 1)
100+
self._seek(self.tell() + 1, False)
101101
except EOFError:
102102
self._n_frames = self.tell() + 1
103103
self.seek(current)
@@ -114,7 +114,7 @@ def is_animated(self):
114114
self._is_animated = True
115115
else:
116116
try:
117-
self.seek(1)
117+
self._seek(1, False)
118118
self._is_animated = True
119119
except EOFError:
120120
self._is_animated = False
@@ -137,7 +137,7 @@ def seek(self, frame):
137137
self.seek(last_frame)
138138
raise EOFError("no more images in GIF file") from e
139139

140-
def _seek(self, frame):
140+
def _seek(self, frame, update_image=True):
141141

142142
if frame == 0:
143143
# rewind
@@ -149,7 +149,7 @@ def _seek(self, frame):
149149
self.disposal_method = 0
150150
else:
151151
# ensure that the previous frame was loaded
152-
if self.tile:
152+
if self.tile and update_image:
153153
self.load()
154154

155155
if frame != self.__frame + 1:
@@ -171,19 +171,20 @@ def _seek(self, frame):
171171

172172
self.tile = []
173173

174-
if self.__frame == 1:
175-
self.pyaccess = None
176-
if "transparency" in self.info:
177-
self.mode = "RGBA"
178-
self.im.putpalettealpha(self.info["transparency"], 0)
179-
self.im = self.im.convert("RGBA", Image.Dither.FLOYDSTEINBERG)
174+
if update_image:
175+
if self.__frame == 1:
176+
self.pyaccess = None
177+
if "transparency" in self.info:
178+
self.mode = "RGBA"
179+
self.im.putpalettealpha(self.info["transparency"], 0)
180+
self.im = self.im.convert("RGBA", Image.Dither.FLOYDSTEINBERG)
180181

181-
del self.info["transparency"]
182-
else:
183-
self.mode = "RGB"
184-
self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG)
185-
if self.dispose:
186-
self.im.paste(self.dispose, self.dispose_extent)
182+
del self.info["transparency"]
183+
else:
184+
self.mode = "RGB"
185+
self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG)
186+
if self.dispose:
187+
self.im.paste(self.dispose, self.dispose_extent)
187188

188189
palette = None
189190

@@ -275,6 +276,12 @@ def _seek(self, frame):
275276
# raise OSError, "illegal GIF tag `%x`" % s[0]
276277
s = None
277278

279+
if interlace is None:
280+
# self.__fp = None
281+
raise EOFError
282+
if not update_image:
283+
return
284+
278285
frame_palette = palette or self.global_palette
279286

280287
def _rgb(color):
@@ -333,9 +340,6 @@ def _rgb(color):
333340
(bits, interlace),
334341
)
335342
]
336-
else:
337-
# self.__fp = None
338-
raise EOFError
339343

340344
for k in ["duration", "comment", "extension", "loop"]:
341345
if k in info:

0 commit comments

Comments
 (0)