From d46fddf2911eb0587cdd36652a040bc354d621fd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 15 Sep 2026 23:09:45 +1000 Subject: [PATCH 1/2] Do not treat RGB as a rawmode for an RGB palette --- Tests/test_imagepalette.py | 16 +++++++++++----- src/PIL/ImagePalette.py | 3 ++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Tests/test_imagepalette.py b/Tests/test_imagepalette.py index aa0882b3e0c..1f62b1f8f7e 100644 --- a/Tests/test_imagepalette.py +++ b/Tests/test_imagepalette.py @@ -179,17 +179,23 @@ def test_make_gamma_lut() -> None: assert lut[255] == 255 -def test_rawmode_valueerrors(tmp_path: Path) -> None: +def test_raw() -> None: + data = list(range(256)) * 3 + palette = ImagePalette.raw("RGB", data) + assert palette.tobytes() == bytes(data) + + +def test_raw_valueerrors(tmp_path: Path) -> None: # Arrange - palette = ImagePalette.raw("RGB", list(range(256)) * 3) + palette = ImagePalette.raw("BGR", list(range(256)) * 3) # Act / Assert - with pytest.raises(ValueError): + with pytest.raises(ValueError, match="palette contains raw palette data"): palette.tobytes() - with pytest.raises(ValueError): + with pytest.raises(ValueError, match="palette contains raw palette data"): palette.getcolor((1, 2, 3)) f = str(tmp_path / "temp.lut") - with pytest.raises(ValueError): + with pytest.raises(ValueError, match="palette contains raw palette data"): palette.save(f) diff --git a/src/PIL/ImagePalette.py b/src/PIL/ImagePalette.py index 80a44fa7f6c..b775eef85d0 100644 --- a/src/PIL/ImagePalette.py +++ b/src/PIL/ImagePalette.py @@ -233,7 +233,8 @@ def save(self, fp: str | IO[str]) -> None: def raw(rawmode: str, data: Sequence[int] | bytes | bytearray) -> ImagePalette: palette = ImagePalette() - palette.rawmode = rawmode + if rawmode != "RGB": + palette.rawmode = rawmode palette.palette = data palette.dirty = 1 return palette From 684ae28b39a64b44213c2dbeb582bfac82b062d1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 15 Sep 2026 23:26:21 +1000 Subject: [PATCH 2/2] Simplify code --- src/PIL/Image.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 82e71035787..4f77af1ec5f 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2161,11 +2161,7 @@ def putpalette( msg = "illegal image mode" raise ValueError(msg) if isinstance(data, ImagePalette.ImagePalette): - if data.rawmode is not None: - palette = ImagePalette.raw(data.rawmode, data.palette) - else: - palette = ImagePalette.ImagePalette(palette=data.palette) - palette.dirty = 1 + palette = ImagePalette.raw(data.rawmode or "RGB", data.palette) else: if not isinstance(data, bytes): data = bytes(data)