Skip to content

Commit e7a53ba

Browse files
authored
Do not update palette for L mode GIF frame (#8924)
2 parents c22230b + d8afcb7 commit e7a53ba

File tree

3 files changed

+18
-3
lines changed

3 files changed

+18
-3
lines changed
15.9 KB
Loading

Tests/test_file_gif.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,18 @@ def test_l_mode_after_rgb() -> None:
100100
assert im.mode == "RGB"
101101

102102

103+
def test_l_mode_transparency_after_rgb() -> None:
104+
with Image.open("Tests/images/no_palette_with_transparency_after_rgb.gif") as im:
105+
expected = im.convert("RGB")
106+
d = ImageDraw.Draw(expected)
107+
d.rectangle([(0, 0), (64, 128)], fill="#000")
108+
109+
im.seek(1)
110+
assert im.mode == "RGB"
111+
112+
assert_image_equal(im, expected)
113+
114+
103115
def test_palette_not_needed_for_second_frame() -> None:
104116
with Image.open("Tests/images/palette_not_needed_for_second_frame.gif") as im:
105117
im.seek(1)

src/PIL/GifImagePlugin.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -480,8 +480,11 @@ def load_end(self) -> None:
480480
self._prev_im = expanded_im
481481
assert self._prev_im is not None
482482
if self._frame_transparency is not None:
483-
self.im.putpalettealpha(self._frame_transparency, 0)
484-
frame_im = self.im.convert("RGBA")
483+
if self.mode == "L":
484+
frame_im = self.im.convert_transparent("LA", self._frame_transparency)
485+
else:
486+
self.im.putpalettealpha(self._frame_transparency, 0)
487+
frame_im = self.im.convert("RGBA")
485488
else:
486489
frame_im = self.im.convert("RGB")
487490

@@ -490,7 +493,7 @@ def load_end(self) -> None:
490493

491494
self.im = self._prev_im
492495
self._mode = self.im.mode
493-
if frame_im.mode == "RGBA":
496+
if frame_im.mode in ("LA", "RGBA"):
494497
self.im.paste(frame_im, self.dispose_extent, frame_im)
495498
else:
496499
self.im.paste(frame_im, self.dispose_extent)

0 commit comments

Comments
 (0)