From 95182149806ce9c61a2dce39d0876a8cc1b25c31 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 25 Mar 2014 21:42:04 -0700 Subject: [PATCH 1/3] Tests for #544 --- Tests/test_image_convert.py | 8 ++++++++ Tests/test_image_quantize.py | 7 ++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index fd3d39bc5..d3bdb519c 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -46,5 +46,13 @@ def test_16bit_workaround(): im = Image.open('Tests/images/16bit.cropped.tif') _test_float_conversion(im.convert('I')) +def test_rgba_p(): + im = lena('RGBA') + im.putalpha(lena('L')) + converted = im.convert('P') + comparable = converted.convert('RGBA') + + assert_image_similar(im, comparable, 20) + diff --git a/Tests/test_image_quantize.py b/Tests/test_image_quantize.py index 70b5eb503..dbf68a25e 100644 --- a/Tests/test_image_quantize.py +++ b/Tests/test_image_quantize.py @@ -19,4 +19,9 @@ def test_octree_quantize(): im = im.quantize(100, Image.FASTOCTREE) assert_image(im, "P", im.size) - assert len(im.getcolors()) == 100 \ No newline at end of file + assert len(im.getcolors()) == 100 + +def test_rgba_quantize(): + im = lena('RGBA') + assert_no_exception(lambda: im.quantize()) + assert_exception(Exception, lambda: im.quantize(method=0)) From abebac25ccdb811ae6ac574f44de8dc36591645b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 25 Mar 2014 21:35:20 -0700 Subject: [PATCH 2/3] Sane quantize defaults for RGBA->P, fixes #544 --- PIL/Image.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/PIL/Image.py b/PIL/Image.py index 7713fe7d9..ed3269169 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -735,6 +735,9 @@ class Image: im = self.im.convert_matrix(mode, matrix) return self._new(im) + if mode == "P" and self.mode == "RGBA": + return self.quantize(colors) + if mode == "P" and palette == ADAPTIVE: im = self.im.quantize(colors) new = self._new(im) @@ -762,7 +765,7 @@ class Image: return self._new(im) - def quantize(self, colors=256, method=0, kmeans=0, palette=None): + def quantize(self, colors=256, method=None, kmeans=0, palette=None): # methods: # 0 = median cut @@ -773,7 +776,18 @@ class Image: # quantizer interface in a later version of PIL. self.load() + + if method is None: + # defaults: + method = 0 + if self.mode == 'RGBA': + method = 2 + if self.mode == 'RGBA' and method != 2: + # Caller specified an invalid mode. + raise ValueError('Fast Octree (method == 2) is the ' + + ' only valid method for quantizing RGBA images') + if palette: # use palette from reference image palette.load() From a190d641652c6f818a772f864054f639f65e5100 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 25 Mar 2014 21:44:28 -0700 Subject: [PATCH 3/3] Changes.rst updated --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 38349c2d1..a839db40d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog (Pillow) 2.4.0 (unreleased) ------------------ +- Conversions enabled from RGBA->P, Fixes #544 + [wiredfool] + - Add more detailed error messages to Image.py [larsmans]