diff --git a/Tests/test_imagepalette.py b/Tests/test_imagepalette.py index 3f37c23c5ae..da0f652df00 100644 --- a/Tests/test_imagepalette.py +++ b/Tests/test_imagepalette.py @@ -15,6 +15,20 @@ def test_sanity() -> None: assert len(palette.colors) == 256 +def test_colors_rawmode() -> None: + palette = ImagePalette.raw( + "BGRX", + (0, 0, 0, 0, 255, 255, 255, 0, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 0), + ) + assert palette.colors == { + (0, 0, 0): 0, + (255, 255, 255): 1, + (255, 0, 0): 2, + (0, 255, 0): 3, + (0, 0, 255): 4, + } + + def test_reload() -> None: with Image.open("Tests/images/hopper.gif") as im: original = im.copy() diff --git a/src/PIL/ImagePalette.py b/src/PIL/ImagePalette.py index 03fb4d8c4a4..1d4a2f04bb8 100644 --- a/src/PIL/ImagePalette.py +++ b/src/PIL/ImagePalette.py @@ -62,10 +62,18 @@ def palette(self, palette: Sequence[int] | bytes | bytearray) -> None: @property def colors(self) -> dict[tuple[int, ...], int]: if self._colors is None: + palette = self.palette + if self.rawmode: + from . import Image + + im = Image.core.new("P", (0, 0)) + im.putpalette(self.mode, self.rawmode, bytes(palette)) + palette = im.getpalette(self.mode, self.mode) + mode_len = len(self.mode) self._colors = {} - for i in range(0, len(self.palette), mode_len): - color = tuple(self.palette[i : i + mode_len]) + for i in range(0, len(palette), mode_len): + color = tuple(palette[i : i + mode_len]) if color in self._colors: continue self._colors[color] = i // mode_len