Skip to content

Commit

Permalink
Merge pull request #6061 from radarhere/getpalette
Browse files Browse the repository at this point in the history
  • Loading branch information
hugovk committed Feb 20, 2022
2 parents b78e601 + 1194805 commit b803b7c
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 2 deletions.
25 changes: 25 additions & 0 deletions Tests/test_image_getpalette.py
@@ -1,3 +1,5 @@
from PIL import Image

from .helper import hopper


Expand All @@ -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]
7 changes: 7 additions & 0 deletions docs/releasenotes/9.1.0.rst
Expand Up @@ -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
=============

Expand Down
12 changes: 10 additions & 2 deletions src/PIL/Image.py
Expand Up @@ -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):
"""
Expand Down
1 change: 1 addition & 0 deletions src/libImaging/Pack.c
Expand Up @@ -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},
Expand Down

0 comments on commit b803b7c

Please sign in to comment.