diff --git a/Tests/test_image.py b/Tests/test_image.py index 89894c9a773..ef0f1477f74 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -498,6 +498,12 @@ def test_storage_neg(self): with pytest.raises(ValueError): Image.core.fill("RGB", (2, -2), (0, 0, 0)) + def test_one_item_tuple(self): + for mode in ("I", "F", "L"): + im = Image.new(mode, (100, 100), (5,)) + px = im.load() + assert px[0, 0] == 5 + def test_linear_gradient_wrong_mode(self): # Arrange wrong_mode = "RGB" diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 9afeb77f7ae..e86dc8530f0 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -330,21 +330,22 @@ def test_p_putpixel_rgb_rgba(self): class TestImagePutPixelError(AccessTest): IMAGE_MODES1 = ["L", "LA", "RGB", "RGBA"] IMAGE_MODES2 = ["I", "I;16", "BGR;15"] - INVALID_TYPES1 = ["foo", 1.0, None] - INVALID_TYPES2 = [*INVALID_TYPES1, (10,)] + INVALID_TYPES = ["foo", 1.0, None] @pytest.mark.parametrize("mode", IMAGE_MODES1) def test_putpixel_type_error1(self, mode): im = hopper(mode) - for v in self.INVALID_TYPES1: + for v in self.INVALID_TYPES: with pytest.raises(TypeError, match="color must be int or tuple"): im.putpixel((0, 0), v) @pytest.mark.parametrize("mode", IMAGE_MODES2) def test_putpixel_type_error2(self, mode): im = hopper(mode) - for v in self.INVALID_TYPES2: - with pytest.raises(TypeError, match="color must be int"): + for v in self.INVALID_TYPES: + with pytest.raises( + TypeError, match="color must be int or single-element tuple" + ): im.putpixel((0, 0), v) @pytest.mark.parametrize("mode", IMAGE_MODES1 + IMAGE_MODES2) diff --git a/src/_imaging.c b/src/_imaging.c index d3159a49415..fad13ae8a4e 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -518,6 +518,9 @@ getink(PyObject* color, Imaging im, char* ink) be cast to either UINT8 or INT32 */ int rIsInt = 0; + if (PyTuple_Check(color) && PyTuple_Size(color) == 1) { + color = PyTuple_GetItem(color, 0); + } if (im->type == IMAGING_TYPE_UINT8 || im->type == IMAGING_TYPE_INT32 || im->type == IMAGING_TYPE_SPECIAL) { @@ -533,7 +536,7 @@ getink(PyObject* color, Imaging im, char* ink) return NULL; } } else { - PyErr_SetString(PyExc_TypeError, "color must be int"); + PyErr_SetString(PyExc_TypeError, "color must be int or single-element tuple"); return NULL; } }