diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index 7e1b811e975..2cf6ee39b23 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -380,6 +380,9 @@ def test_dxt5_colorblock_alpha_issue_4142() -> None: def test_palette() -> None: with Image.open("Tests/images/palette.dds") as im: + assert im.palette is not None + assert len(im.palette.tobytes()) == 1024 + assert_image_equal_tofile(im, "Tests/images/transparent.gif") diff --git a/Tests/test_imagepalette.py b/Tests/test_imagepalette.py index 873a431f95f..bb53a7cda68 100644 --- a/Tests/test_imagepalette.py +++ b/Tests/test_imagepalette.py @@ -191,17 +191,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/DdsImagePlugin.py b/src/PIL/DdsImagePlugin.py index 40012bc27ad..febe0c70afc 100644 --- a/src/PIL/DdsImagePlugin.py +++ b/src/PIL/DdsImagePlugin.py @@ -383,8 +383,8 @@ def _open(self) -> None: raise OSError(msg) elif pfflags & DDPF.PALETTEINDEXED8: self._mode = "P" - self.palette = ImagePalette.raw("RGBA", self.fp.read(1024)) - self.palette.mode = "RGBA" + self.palette = ImagePalette.ImagePalette("RGBA", self.fp.read(1024)) + self.palette.dirty = 1 elif pfflags & DDPF.FOURCC: offset = header_size + 4 if fourcc == D3DFMT.DXT1: diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 96d6ec1396a..13a761eabf3 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: palette = ImagePalette.raw(rawmode, data) self._mode = "PA" if "A" in self.mode else "P" diff --git a/src/PIL/ImagePalette.py b/src/PIL/ImagePalette.py index 6476e2a3dfb..e6b68c1e34c 100644 --- a/src/PIL/ImagePalette.py +++ b/src/PIL/ImagePalette.py @@ -237,7 +237,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