diff --git a/Tests/test_image_getpalette.py b/Tests/test_image_getpalette.py index 1818adca2..1690e411c 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,28 @@ def test_palette(): 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)) + + rgb = im.getpalette("RGB") + assert len(rgb) == 256 * 3 + assert rgb[:3] == [1, 2, 3] + + # Convert the RGB palette to RGBA + rgba = im.getpalette("RGBA") + assert len(rgba) == 256 * 4 + assert rgba[:4] == [1, 2, 3, 255] + + im.putpalette((1, 2, 3, 4), "RGBA") + + # Convert the RGBA palette to RGB + rgb = im.getpalette("RGB") + assert len(rgb) == 256 * 3 + assert rgb[:3] == [1, 2, 3] + + rgba = im.getpalette("RGBA") + assert len(rgba) == 256 * 4 + assert rgba[:4] == [1, 2, 3, 4] diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 8d36e8871..cabcf435a 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1401,19 +1401,21 @@ class Image: 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. :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 + return list(self.im.getpalette(mode, rawmode)) def getpixel(self, xy): """ diff --git a/src/libImaging/Pack.c b/src/libImaging/Pack.c index 0c7c0497e..01760e742 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},