Allow putpalette for LA and PA

This commit is contained in:
Andrew Murray 2019-03-20 08:13:56 +11:00
parent 819b8acd26
commit dba38912fb
3 changed files with 12 additions and 9 deletions

View File

@ -14,8 +14,10 @@ class TestImagePutPalette(PillowTestCase):
return im.mode, p[:10] return im.mode, p[:10]
return im.mode return im.mode
self.assertRaises(ValueError, palette, "1") self.assertRaises(ValueError, palette, "1")
self.assertEqual(palette("L"), ("P", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])) for mode in ["L", "LA", "P", "PA"]:
self.assertEqual(palette("P"), ("P", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])) self.assertEqual(palette(mode),
("PA" if "A" in mode else "P",
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))
self.assertRaises(ValueError, palette, "I") self.assertRaises(ValueError, palette, "I")
self.assertRaises(ValueError, palette, "F") self.assertRaises(ValueError, palette, "F")
self.assertRaises(ValueError, palette, "RGB") self.assertRaises(ValueError, palette, "RGB")

View File

@ -1619,10 +1619,10 @@ class Image(object):
def putpalette(self, data, rawmode="RGB"): def putpalette(self, data, rawmode="RGB"):
""" """
Attaches a palette to this image. The image must be a "P" or Attaches a palette to this image. The image must be a "P",
"L" image, and the palette sequence must contain 768 integer "PA", "L" or "LA" image, and the palette sequence must contain
values, where each group of three values represent the red, 768 integer values, where each group of three values represent
green, and blue values for the corresponding pixel the red, green, and blue values for the corresponding pixel
index. Instead of an integer sequence, you can use an 8-bit index. Instead of an integer sequence, you can use an 8-bit
string. string.
@ -1631,7 +1631,7 @@ class Image(object):
""" """
from . import ImagePalette from . import ImagePalette
if self.mode not in ("L", "P"): if self.mode not in ("L", "LA", "P", "PA"):
raise ValueError("illegal image mode") raise ValueError("illegal image mode")
self.load() self.load()
if isinstance(data, ImagePalette.ImagePalette): if isinstance(data, ImagePalette.ImagePalette):
@ -1643,7 +1643,7 @@ class Image(object):
else: else:
data = "".join(chr(x) for x in data) data = "".join(chr(x) for x in data)
palette = ImagePalette.raw(rawmode, data) palette = ImagePalette.raw(rawmode, data)
self.mode = "P" self.mode = "PA" if "A" in self.mode else "P"
self.palette = palette self.palette = palette
self.palette.mode = "RGB" self.palette.mode = "RGB"
self.load() # install new palette self.load() # install new palette

View File

@ -1569,7 +1569,8 @@ _putpalette(ImagingObject* self, PyObject* args)
if (!PyArg_ParseTuple(args, "s"PY_ARG_BYTES_LENGTH, &rawmode, &palette, &palettesize)) if (!PyArg_ParseTuple(args, "s"PY_ARG_BYTES_LENGTH, &rawmode, &palette, &palettesize))
return NULL; return NULL;
if (strcmp(self->image->mode, "L") != 0 && strcmp(self->image->mode, "P")) { if (strcmp(self->image->mode, "L") && strcmp(self->image->mode, "LA") &&
strcmp(self->image->mode, "P") && strcmp(self->image->mode, "PA")) {
PyErr_SetString(PyExc_ValueError, wrong_mode); PyErr_SetString(PyExc_ValueError, wrong_mode);
return NULL; return NULL;
} }