From d8ca9f2b5f020b72c85bafac3115da254b7edd82 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 21 Sep 2026 23:54:10 +1000 Subject: [PATCH 1/2] Only load new palette in putpalette() if it contains raw data --- Tests/test_image_putpalette.py | 3 +++ src/PIL/Image.py | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Tests/test_image_putpalette.py b/Tests/test_image_putpalette.py index 237de63305a..5c92519dddb 100644 --- a/Tests/test_image_putpalette.py +++ b/Tests/test_image_putpalette.py @@ -11,6 +11,9 @@ def test_putpalette() -> None: def palette(mode: str) -> str | tuple[str, list[int]]: im = hopper(mode).copy() im.putpalette(list(range(256)) * 3) + assert im.palette is not None + assert im.palette.dirty + p = im.getpalette() if p: return im.mode, p[:10] diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 873de8607bf..ee579fc7862 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2170,7 +2170,8 @@ def putpalette( self.palette.mode = "CMYK" elif "A" in rawmode: self.palette.mode = "RGBA" - self.load() # install new palette + if self.palette.rawmode: + self.load() # decode raw palette data def putpixel( self, From ec3248293878ac5cb7d4681d2da5305358b8e324 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 21 Sep 2026 23:56:50 +1000 Subject: [PATCH 2/2] Do not treat RGBA or CMYK as rawmode if it matches palette mode --- Tests/test_image_putpalette.py | 4 ++++ src/PIL/Image.py | 2 ++ 2 files changed, 6 insertions(+) diff --git a/Tests/test_image_putpalette.py b/Tests/test_image_putpalette.py index 5c92519dddb..6b89807db34 100644 --- a/Tests/test_image_putpalette.py +++ b/Tests/test_image_putpalette.py @@ -89,6 +89,8 @@ def test_putpalette_with_alpha_values() -> None: def test_rgba_palette(mode: str, palette: tuple[int, ...]) -> None: im = Image.new("P", (1, 1)) im.putpalette(palette, mode) + assert im.palette is not None + assert im.palette.dirty == (1 if mode == "RGBA" else 0) assert im.getpalette() == [1, 2, 3] assert im.palette is not None assert im.palette.colors == {(1, 2, 3, 4): 0} @@ -104,6 +106,8 @@ def test_rgba_palette(mode: str, palette: tuple[int, ...]) -> None: def test_cmyk_palette(mode: str, palette: tuple[int, ...]) -> None: im = Image.new("P", (1, 1)) im.putpalette(palette, mode) + assert im.palette is not None + assert im.palette.dirty == (1 if mode == "CMYK" else 0) assert im.getpalette() == [250, 249, 248] assert im.palette is not None assert im.palette.colors == {(1, 2, 3, 4): 0} diff --git a/src/PIL/Image.py b/src/PIL/Image.py index ee579fc7862..5ffbcc27277 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2170,6 +2170,8 @@ def putpalette( self.palette.mode = "CMYK" elif "A" in rawmode: self.palette.mode = "RGBA" + if self.palette.mode == self.palette.rawmode: + self.palette.rawmode = None if self.palette.rawmode: self.load() # decode raw palette data