From 97e111d079c23d3d287ceb627287fe3decdded90 Mon Sep 17 00:00:00 2001 From: Nikita Uvarov Date: Thu, 7 Aug 2014 16:23:08 +0300 Subject: [PATCH 1/4] Fixed wrong mode of gif image. In case of L mode and small image. --- PIL/GifImagePlugin.py | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index 4107c6ba3..640af9efc 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -268,10 +268,9 @@ def _save(im, fp, filename): except IOError: pass # write uncompressed file - try: - rawmode = RAWMODE[im.mode] + if im.mode in RAWMODE: imOut = im - except KeyError: + else: # convert on the fly (EXPERIMENTAL -- I'm not sure PIL # should automatically convert images on save...) if Image.getmodebase(im.mode) == "RGB": @@ -279,10 +278,8 @@ def _save(im, fp, filename): if im.palette: palette_size = len(im.palette.getdata()[1]) // 3 imOut = im.convert("P", palette=1, colors=palette_size) - rawmode = "P" else: imOut = im.convert("L") - rawmode = "L" # header try: @@ -290,12 +287,6 @@ def _save(im, fp, filename): except KeyError: palette = None im.encoderinfo["optimize"] = im.encoderinfo.get("optimize", True) - if im.encoderinfo["optimize"]: - # When the mode is L, and we optimize, we end up with - # im.mode == P and rawmode = L, which fails. - # If we're optimizing the palette, we're going to be - # in a rawmode of P anyway. - rawmode = 'P' header, usedPaletteColors = getheader(imOut, palette, im.encoderinfo) for s in header: @@ -352,7 +343,7 @@ def _save(im, fp, filename): o8(8)) # bits imOut.encoderconfig = (8, interlace) - ImageFile._save(imOut, fp, [("gif", (0,0)+im.size, 0, rawmode)]) + ImageFile._save(imOut, fp, [("gif", (0,0)+im.size, 0, RAWMODE[imOut.mode])]) fp.write(b"\0") # end of image data From 9604cf814bdb210a1ed2e684e2910875a40df6c7 Mon Sep 17 00:00:00 2001 From: Nikita Uvarov Date: Tue, 19 Aug 2014 12:24:44 +0300 Subject: [PATCH 2/4] Added test case for gif image (mode L): optimization turned on, but not needed. --- Tests/test_file_gif.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 93b826fd6..0111d3965 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -35,6 +35,14 @@ class TestFileGif(PillowTestCase): self.assertEqual(test(0), 800) self.assertEqual(test(1), 38) + def test_optimize_full_L(self): + from io import BytesIO + + im = Image.frombytes("L", (16, 16), bytes(range(256))) + file = BytesIO() + im.save(file, "GIF", optimize=optimize) + self.assertEqual(im.mode, "L") + def test_roundtrip(self): out = self.tempfile('temp.gif') im = lena() From 78081a24989469ef43d3b5d31265ab0c73f80d08 Mon Sep 17 00:00:00 2001 From: Nikita Uvarov Date: Tue, 19 Aug 2014 12:32:52 +0300 Subject: [PATCH 3/4] Fixed test_optimize_full_l gif file test case. --- Tests/test_file_gif.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 0111d3965..12e12b2f3 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -35,12 +35,12 @@ class TestFileGif(PillowTestCase): self.assertEqual(test(0), 800) self.assertEqual(test(1), 38) - def test_optimize_full_L(self): + def test_optimize_full_l(self): from io import BytesIO im = Image.frombytes("L", (16, 16), bytes(range(256))) file = BytesIO() - im.save(file, "GIF", optimize=optimize) + im.save(file, "GIF", optimize=True) self.assertEqual(im.mode, "L") def test_roundtrip(self): From 778768c9bc333ecba88b1080512e2b384c6f5b3c Mon Sep 17 00:00:00 2001 From: Nikita Uvarov Date: Tue, 19 Aug 2014 15:00:15 +0300 Subject: [PATCH 4/4] Fixed test_optimize_full_l test case for python2. --- Tests/test_file_gif.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 12e12b2f3..bd4a6e76c 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -38,7 +38,7 @@ class TestFileGif(PillowTestCase): def test_optimize_full_l(self): from io import BytesIO - im = Image.frombytes("L", (16, 16), bytes(range(256))) + im = Image.frombytes("L", (16, 16), bytes(bytearray(range(256)))) file = BytesIO() im.save(file, "GIF", optimize=True) self.assertEqual(im.mode, "L")