From d05b5d906093c40e40182111138832326e3b11d3 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 10 Dec 2013 15:47:26 -0800 Subject: [PATCH 1/2] Restore numpy.array as valid lookup tables --- PIL/Image.py | 2 +- Tests/test_numpy.py | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/PIL/Image.py b/PIL/Image.py index cf5c4f477..43748ee76 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1150,7 +1150,7 @@ class Image: if isinstance(lut, ImagePointHandler): return lut.point(self) - if not isinstance(lut, collections.Sequence): + if callable(lut): # if it isn't a list, it should be a function if self.mode in ("I", "I;16", "F"): # check if the function can be used with point_transform diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 61b3cf480..85596047b 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -106,3 +106,15 @@ def test_to_array(): for mode in modes: assert_no_exception(lambda: _to_array(*mode)) + +def test_point_lut(): + # see https://github.com/python-imaging/Pillow/issues/439 + + data = list(range(256))*3 + lut = numpy.array(data, dtype='uint8') + + im = lena() + + assert_no_exception(lambda: im.point(lut)) + + From 4791d156f1d8e0a1be456092177decb942869856 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 10 Dec 2013 16:05:05 -0800 Subject: [PATCH 2/2] Comments/Docs, fixes #440 --- PIL/Image.py | 16 ++++++++++------ Tests/test_image_point.py | 9 +++++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 43748ee76..95673b7fa 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1134,14 +1134,16 @@ class Image: """ Maps this image through a lookup table or function. - :param lut: A lookup table, containing 256 values per band in the - image. A function can be used instead, it should take a single - argument. The function is called once for each possible pixel - value, and the resulting table is applied to all bands of the - image. + :param lut: A lookup table, containing 256 (or 65336 if + self.mode=="I" and mode == "L") values per band in the + image. A function can be used instead, it should take a + single argument. The function is called once for each + possible pixel value, and the resulting table is applied to + all bands of the image. :param mode: Output mode (default is same as input). In the current version, this can only be used if the source image - has mode "L" or "P", and the output has mode "1". + has mode "L" or "P", and the output has mode "1" or the + source image mode is "I" and the output mode is "L". :returns: An :py:class:`~PIL.Image.Image` object. """ @@ -1154,6 +1156,8 @@ class Image: # if it isn't a list, it should be a function if self.mode in ("I", "I;16", "F"): # check if the function can be used with point_transform + # UNDONE wiredfool -- I think this prevents us from ever doing + # a gamma function point transform on > 8bit images. scale, offset = _getscaleoffset(lut) return self._new(self.im.point_transform(scale, offset)) # for other modes, convert the function to a table diff --git a/Tests/test_image_point.py b/Tests/test_image_point.py index cb24485ae..c70556f6a 100644 --- a/Tests/test_image_point.py +++ b/Tests/test_image_point.py @@ -17,3 +17,12 @@ def test_sanity(): assert_no_exception(lambda: im.point(lambda x: x*1+1)) assert_exception(TypeError, lambda: im.point(lambda x: x-1)) assert_exception(TypeError, lambda: im.point(lambda x: x/1)) + + +def test_16bit_lut(): + """ Tests for 16 bit -> 8 bit lut for converting I->L images + see https://github.com/python-imaging/Pillow/issues/440 + """ + + im = lena("I") + assert_no_exception(lambda: im.point(list(range(256))*256, 'L'))