diff --git a/Tests/test_image_getpalette.py b/Tests/test_image_getpalette.py index 1818adca234..58a6dacbbbb 100644 --- a/Tests/test_image_getpalette.py +++ b/Tests/test_image_getpalette.py @@ -1,3 +1,5 @@ +from PIL import Image + from .helper import hopper @@ -17,3 +19,26 @@ def palette(mode): assert palette("RGBA") is None assert palette("CMYK") is None assert palette("YCbCr") is None + + +def test_palette_rawmode(): + im = Image.new("P", (1, 1)) + im.putpalette((1, 2, 3)) + + for rawmode in ("RGB", None): + rgb = im.getpalette(rawmode) + assert rgb == [1, 2, 3] + + # Convert the RGB palette to RGBA + rgba = im.getpalette("RGBA") + assert rgba == [1, 2, 3, 255] + + im.putpalette((1, 2, 3, 4), "RGBA") + + # Convert the RGBA palette to RGB + rgb = im.getpalette("RGB") + assert rgb == [1, 2, 3] + + for rawmode in ("RGBA", None): + rgba = im.getpalette(rawmode) + assert rgba == [1, 2, 3, 4] diff --git a/docs/releasenotes/9.1.0.rst b/docs/releasenotes/9.1.0.rst index bd296a62374..4ceab3f1893 100644 --- a/docs/releasenotes/9.1.0.rst +++ b/docs/releasenotes/9.1.0.rst @@ -111,6 +111,13 @@ At present, the information within each block is merely returned as a dictionary "data" entry. This will allow more useful information to be added in the future without breaking backwards compatibility. +Added rawmode argument to Image.getpalette() +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, :py:meth:`~PIL.Image.Image.getpalette` returns RGB data from the palette. +A ``rawmode`` argument has been added, to allow the mode to be chosen instead. ``None`` +can be used to return data in the current mode of the palette. + Other Changes ============= diff --git a/src/PIL/Image.py b/src/PIL/Image.py index a32fc51bd16..c9265b5ab62 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1441,19 +1441,27 @@ def getim(self): self.load() return self.im.ptr - def getpalette(self): + def getpalette(self, rawmode="RGB"): """ Returns the image palette as a list. + :param rawmode: The mode in which to return the palette. ``None`` will + return the palette in its current mode. + + .. versionadded:: 9.1.0 + :returns: A list of color values [r, g, b, ...], or None if the image has no palette. """ self.load() try: - return list(self.im.getpalette()) + mode = self.im.getpalettemode() except ValueError: return None # no palette + if rawmode is None: + rawmode = mode + return list(self.im.getpalette(mode, rawmode)) def getpixel(self, xy): """ diff --git a/src/libImaging/Pack.c b/src/libImaging/Pack.c index 0c7c0497efe..01760e742be 100644 --- a/src/libImaging/Pack.c +++ b/src/libImaging/Pack.c @@ -574,6 +574,7 @@ static struct { /* true colour */ {"RGB", "RGB", 24, ImagingPackRGB}, {"RGB", "RGBX", 32, copy4}, + {"RGB", "RGBA", 32, copy4}, {"RGB", "XRGB", 32, ImagingPackXRGB}, {"RGB", "BGR", 24, ImagingPackBGR}, {"RGB", "BGRX", 32, ImagingPackBGRX},