diff --git a/Tests/test_image.py b/Tests/test_image.py index eb3882ddc..288e18528 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -1126,6 +1126,12 @@ class TestImage: 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 33f844437..6c7026d47 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -107,6 +107,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_rgba() -> None: with Image.open("Tests/images/transparent.png") as im: assert im.mode == "RGBA" diff --git a/src/PIL/Image.py b/src/PIL/Image.py index b17fd131d..21f1635c1 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1009,8 +1009,14 @@ class Image: 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 fbfc0e41a..6ab8e010d 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 *