diff --git a/Tests/test_image.py b/Tests/test_image.py index 17864436527..ac30f785c5e 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -1099,6 +1099,12 @@ def test_apply_transparency(self) -> None: assert im.palette is not None assert im.palette.colors[(27, 35, 6, 214)] == 24 + def test_merge_pa(self) -> None: + p = hopper("P") + a = Image.new("L", p.size) + pa = Image.merge("PA", (p, a)) + assert p.getpalette() == pa.getpalette() + def test_constants(self) -> None: for enum in ( Image.Transpose, diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 7ba3fb55536..8d0ef4b221d 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -97,6 +97,13 @@ def test_opaque() -> None: assert_image_equal(alpha, solid) +def test_rgba() -> None: + with Image.open("Tests/images/transparent.png") as im: + assert im.mode == "RGBA" + + assert_image_similar(im.convert("RGBa").convert("RGB"), im.convert("RGB"), 1.5) + + def test_rgba_p() -> None: im = hopper("RGBA") im.putalpha(hopper("L")) @@ -107,6 +114,13 @@ def test_rgba_p() -> None: assert_image_similar(im, comparable, 20) +def test_rgba_pa() -> None: + im = hopper("RGBA").convert("PA").convert("RGB") + expected = hopper("RGB") + + assert_image_similar(im, expected, 9.3) + + def test_pa() -> None: im = hopper().convert("PA") @@ -115,13 +129,6 @@ def test_pa() -> None: assert palette.colors != {} -def test_rgba() -> None: - with Image.open("Tests/images/transparent.png") as im: - assert im.mode == "RGBA" - - assert_image_similar(im.convert("RGBa").convert("RGB"), im.convert("RGB"), 1.5) - - def test_trns_p(tmp_path: Path) -> None: im = hopper("P") im.info["transparency"] = 0 diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 6c4c48dd551..dff7161cff1 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1009,8 +1009,14 @@ def convert_transparency( new_im.info["transparency"] = transparency return new_im - if mode == "P" and self.mode == "RGBA": - return self.quantize(colors) + if self.mode == "RGBA": + if mode == "P": + return self.quantize(colors) + elif mode == "PA": + r, g, b, a = self.split() + rgb = merge("RGB", (r, g, b)) + p = rgb.quantize(colors) + return merge("PA", (p, a)) trns = None delete_trns = False diff --git a/src/_imaging.c b/src/_imaging.c index fbfc0e41ae2..6ab8e010d8c 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -2419,7 +2419,12 @@ _merge(PyObject *self, PyObject *args) { bands[3] = band3->image; } - return PyImagingNew(ImagingMerge(mode, bands)); + Imaging imOut = ImagingMerge(mode, bands); + if (!imOut) { + return NULL; + } + ImagingCopyPalette(imOut, bands[0]); + return PyImagingNew(imOut); } static PyObject *