diff --git a/Tests/test_file_tga.py b/Tests/test_file_tga.py index 03ab96e05a1..4b55878c917 100644 --- a/Tests/test_file_tga.py +++ b/Tests/test_file_tga.py @@ -88,6 +88,24 @@ def test_palette_depth_16(tmp_path: Path) -> None: assert_image_equal_tofile(reloaded.convert("RGBA"), "Tests/images/p_16.png") +def test_palette_depth_32(tmp_path: Path) -> None: + im = Image.frombytes("L", (1, 2), bytes((0, 1))) + data = [255, 0, 0, 255, 0, 0, 255, 0] + im.putpalette(data, "RGBA") + + out = tmp_path / "temp.tga" + im.save(out) + + with Image.open(out) as reloaded: + assert reloaded.palette is not None + assert reloaded.palette.mode == "RGBA" + assert reloaded.getpalette(None) == data + + reloaded_rgba = reloaded.convert("RGBA") + assert reloaded_rgba.getpixel((0, 0)) == (255, 0, 0, 255) + assert reloaded_rgba.getpixel((0, 1)) == (0, 0, 255, 0) + + def test_rgba_16() -> None: with Image.open("Tests/images/rgba16.tga") as im: assert im.mode == "RGBA" diff --git a/src/PIL/TgaImagePlugin.py b/src/PIL/TgaImagePlugin.py index 56df65718b5..8a112d50558 100644 --- a/src/PIL/TgaImagePlugin.py +++ b/src/PIL/TgaImagePlugin.py @@ -134,6 +134,7 @@ def _open(self) -> None: self.palette = ImagePalette.raw( "BGRA", bytes(4 * start) + self.fp.read(4 * size) ) + self.palette.mode = "RGBA" else: msg = "unknown TGA map depth" raise SyntaxError(msg) @@ -224,8 +225,13 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: warnings.warn("id_section has been trimmed to 255 characters") if colormaptype: - palette = im.im.getpalette("RGB", "BGR") - colormaplength, colormapentry = len(palette) // 3, 24 + assert im.palette is not None + if im.palette.mode == "RGBA": + palette = im.im.getpalette("RGBA", "BGRA") + colormaplength, colormapentry = len(palette) // 4, 32 + else: + palette = im.im.getpalette("RGB", "BGR") + colormaplength, colormapentry = len(palette) // 3, 24 else: colormaplength, colormapentry = 0, 0