From 1c85d4434791565197f676763a7d000ee6f977fd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 22 Feb 2022 21:23:35 +1100 Subject: [PATCH] Fixed loading L mode GIF with transparency --- Tests/images/no_palette_with_transparency.gif | Bin 0 -> 64 bytes Tests/test_file_gif.py | 11 +++++++++++ src/PIL/GifImagePlugin.py | 16 ++++++++++++---- 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 Tests/images/no_palette_with_transparency.gif diff --git a/Tests/images/no_palette_with_transparency.gif b/Tests/images/no_palette_with_transparency.gif new file mode 100644 index 0000000000000000000000000000000000000000..3cd1c0c48eb5bcd8c572b1ad034955190d801e6a GIT binary patch literal 64 ncmZ?wbhEHbWMp7u00PCIEI|4{gARxT7UN)HU}RyzEny7+38e<8 literal 0 HcmV?d00001 diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 011d982f097..682ef3cfec4 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -59,6 +59,17 @@ def test_invalid_file(): GifImagePlugin.GifImageFile(invalid_file) +def test_l_mode_transparency(): + with Image.open("Tests/images/no_palette_with_transparency.gif") as im: + assert im.mode == "L" + assert im.load()[0, 0] == 0 + assert im.info["transparency"] == 255 + + im.seek(1) + assert im.mode == "RGBA" + assert im.load()[0, 0] == (0, 0, 0, 255) + + def test_optimize(): def test_grayscale(optimize): im = Image.new("L", (1, 1), 0) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 4f8ea209dfc..c59ee724762 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -167,9 +167,14 @@ def _seek(self, frame): 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) + else: + self.im = self.im.convert_transparent( + "RGBA", self.info["transparency"] + ) self.mode = "RGBA" - self.im.putpalettealpha(self.info["transparency"], 0) - self.im = self.im.convert("RGBA", Image.Dither.FLOYDSTEINBERG) del self.info["transparency"] else: @@ -368,8 +373,11 @@ def load_end(self): if self.__frame == 0: return if self._frame_transparency is not None: - self.im.putpalettealpha(self._frame_transparency, 0) - frame_im = self.im.convert("RGBA") + if self.mode == "P": + self.im.putpalettealpha(self._frame_transparency, 0) + frame_im = self.im.convert("RGBA") + else: + frame_im = self.im.convert_transparent("RGBA", self._frame_transparency) else: frame_im = self.im.convert("RGB") frame_im = self._crop(frame_im, self.dispose_extent)