Skip to content

Commit

Permalink
Merge pull request #6576 from radarhere/gif
Browse files Browse the repository at this point in the history
  • Loading branch information
hugovk committed Oct 18, 2022
2 parents 3d49166 + 5f8938c commit 745dc33
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 10 deletions.
Binary file added Tests/images/no_palette_after_rgb.gif
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions Tests/test_file_gif.py
Expand Up @@ -83,6 +83,21 @@ def test_l_mode_transparency():
assert im.load()[0, 0] == 128


def test_l_mode_after_rgb():
with Image.open("Tests/images/no_palette_after_rgb.gif") as im:
im.seek(1)
assert im.mode == "RGB"

im.seek(2)
assert im.mode == "RGB"


def test_palette_not_needed_for_second_frame():
with Image.open("Tests/images/palette_not_needed_for_second_frame.gif") as im:
im.seek(1)
assert_image_similar(im, hopper("L").convert("RGB"), 8)


def test_strategy():
with Image.open("Tests/images/iss634.gif") as im:
expected_rgb_always = im.convert("RGB")
Expand Down
19 changes: 9 additions & 10 deletions src/PIL/GifImagePlugin.py
Expand Up @@ -274,6 +274,8 @@ def _seek(self, frame, update_image=True):
p = self.fp.read(3 << bits)
if self._is_palette_needed(p):
palette = ImagePalette.raw("RGB", p)
else:
palette = False

# image data
bits = self.fp.read(1)[0]
Expand All @@ -298,7 +300,7 @@ def _seek(self, frame, update_image=True):
if self.dispose:
self.im.paste(self.dispose, self.dispose_extent)

self._frame_palette = palette or self.global_palette
self._frame_palette = palette if palette is not None else self.global_palette
self._frame_transparency = frame_transparency
if frame == 0:
if self._frame_palette:
Expand Down Expand Up @@ -438,16 +440,13 @@ def load_end(self):
self.mode = "RGB"
self.im = self.im.convert(self.mode, Image.Dither.FLOYDSTEINBERG)
return
if self.mode == "P" and self._prev_im:
if self._frame_transparency is not None:
self.im.putpalettealpha(self._frame_transparency, 0)
frame_im = self.im.convert("RGBA")
else:
frame_im = self.im.convert("RGB")
if not self._prev_im:
return
if self._frame_transparency is not None:
self.im.putpalettealpha(self._frame_transparency, 0)
frame_im = self.im.convert("RGBA")
else:
if not self._prev_im:
return
frame_im = self.im
frame_im = self.im.convert("RGB")
frame_im = self._crop(frame_im, self.dispose_extent)

self.im = self._prev_im
Expand Down

0 comments on commit 745dc33

Please sign in to comment.