Merge pull request #6077 from radarhere/gif

This commit is contained in:
Hugo van Kemenade 2022-03-11 23:05:10 +02:00 committed by GitHub
commit 3e16c3dc28
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -97,7 +97,7 @@ class GifImageFile(ImageFile.ImageFile):
current = self.tell() current = self.tell()
try: try:
while True: while True:
self.seek(self.tell() + 1) self._seek(self.tell() + 1, False)
except EOFError: except EOFError:
self._n_frames = self.tell() + 1 self._n_frames = self.tell() + 1
self.seek(current) self.seek(current)
@ -110,14 +110,16 @@ class GifImageFile(ImageFile.ImageFile):
self._is_animated = self._n_frames != 1 self._is_animated = self._n_frames != 1
else: else:
current = self.tell() current = self.tell()
if current:
try:
self.seek(1)
self._is_animated = True self._is_animated = True
except EOFError: else:
self._is_animated = False try:
self._seek(1, False)
self._is_animated = True
except EOFError:
self._is_animated = False
self.seek(current) self.seek(current)
return self._is_animated return self._is_animated
def seek(self, frame): def seek(self, frame):
@ -135,7 +137,7 @@ class GifImageFile(ImageFile.ImageFile):
self.seek(last_frame) self.seek(last_frame)
raise EOFError("no more images in GIF file") from e raise EOFError("no more images in GIF file") from e
def _seek(self, frame): def _seek(self, frame, update_image=True):
if frame == 0: if frame == 0:
# rewind # rewind
@ -147,14 +149,11 @@ class GifImageFile(ImageFile.ImageFile):
self.disposal_method = 0 self.disposal_method = 0
else: else:
# ensure that the previous frame was loaded # ensure that the previous frame was loaded
if self.tile: if self.tile and update_image:
self.load() self.load()
if frame != self.__frame + 1: if frame != self.__frame + 1:
raise ValueError(f"cannot seek to frame {frame}") raise ValueError(f"cannot seek to frame {frame}")
self.__frame = frame
self.tile = []
self.fp = self.__fp self.fp = self.__fp
if self.__offset: if self.__offset:
@ -164,25 +163,34 @@ class GifImageFile(ImageFile.ImageFile):
pass pass
self.__offset = 0 self.__offset = 0
if self.__frame == 1: s = self.fp.read(1)
self.pyaccess = None if not s or s == b";":
if "transparency" in self.info: raise EOFError
if self.mode == "P":
self.im.putpalettealpha(self.info["transparency"], 0)
self.im = self.im.convert("RGBA", Image.Dither.FLOYDSTEINBERG)
self.mode = "RGBA"
else:
self.im = self.im.convert_transparent(
"LA", self.info["transparency"]
)
self.mode = "LA"
del self.info["transparency"] self.__frame = frame
else:
self.mode = "RGB" self.tile = []
self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG)
if self.dispose: if update_image:
self.im.paste(self.dispose, self.dispose_extent) if self.__frame == 1:
self.pyaccess = None
if "transparency" in self.info:
if self.mode == "P":
self.im.putpalettealpha(self.info["transparency"], 0)
self.im = self.im.convert("RGBA", Image.Dither.FLOYDSTEINBERG)
self.mode = "RGBA"
else:
self.im = self.im.convert_transparent(
"LA", self.info["transparency"]
)
self.mode = "LA"
del self.info["transparency"]
else:
self.mode = "RGB"
self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG)
if self.dispose:
self.im.paste(self.dispose, self.dispose_extent)
palette = None palette = None
@ -191,7 +199,8 @@ class GifImageFile(ImageFile.ImageFile):
interlace = None interlace = None
while True: while True:
s = self.fp.read(1) if not s:
s = self.fp.read(1)
if not s or s == b";": if not s or s == b";":
break break
@ -229,6 +238,7 @@ class GifImageFile(ImageFile.ImageFile):
else: else:
info["comment"] = block info["comment"] = block
block = self.data() block = self.data()
s = None
continue continue
elif s[0] == 255: elif s[0] == 255:
# #
@ -270,6 +280,13 @@ class GifImageFile(ImageFile.ImageFile):
else: else:
pass pass
# raise OSError, "illegal GIF tag `%x`" % s[0] # raise OSError, "illegal GIF tag `%x`" % s[0]
s = None
if interlace is None:
# self.__fp = None
raise EOFError
if not update_image:
return
frame_palette = palette or self.global_palette frame_palette = palette or self.global_palette
@ -329,9 +346,6 @@ class GifImageFile(ImageFile.ImageFile):
(bits, interlace), (bits, interlace),
) )
] ]
else:
# self.__fp = None
raise EOFError
for k in ["duration", "comment", "extension", "loop"]: for k in ["duration", "comment", "extension", "loop"]:
if k in info: if k in info: