From 5c6212052cc735b5aabc895bb18264143b8408c7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Mar 2022 20:11:35 +1100 Subject: [PATCH] Convert subsequent frames of L mode GIF to LA if transparency is present --- Tests/images/no_palette_with_transparency.gif | Bin 0 -> 64 bytes Tests/test_file_gif.py | 11 ++++++++++ src/PIL/GifImagePlugin.py | 19 +++++++++++++----- 3 files changed, 25 insertions(+), 5 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 011d982f0..924adad9e 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 == "LA" + assert im.load()[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 4f8ea209d..b222235d8 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -167,9 +167,15 @@ class GifImageFile(ImageFile.ImageFile): if self.__frame == 1: self.pyaccess = None if "transparency" in self.info: - self.mode = "RGBA" - self.im.putpalettealpha(self.info["transparency"], 0) - self.im = self.im.convert("RGBA", Image.Dither.FLOYDSTEINBERG) + 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: @@ -368,8 +374,11 @@ class GifImageFile(ImageFile.ImageFile): 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("LA", self._frame_transparency) else: frame_im = self.im.convert("RGB") frame_im = self._crop(frame_im, self.dispose_extent)