From 84b32a03885ed3fe5c15d8ab02b7089f45cd003e Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Fri, 3 Aug 2018 14:21:47 -0700 Subject: [PATCH 1/3] Read/Save RGB webp as RGB (instead of RGBX) --- Tests/images/hopper_webp_bits.ppm | Bin 29024 -> 49167 bytes Tests/test_file_webp.py | 17 ++++------------- Tests/test_file_webp_lossless.py | 3 +-- src/PIL/WebPImagePlugin.py | 24 +++++++++++++++++------- src/_webp.c | 2 ++ 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/Tests/images/hopper_webp_bits.ppm b/Tests/images/hopper_webp_bits.ppm index 6dce2da2eb95a3a1f95690ddd1aaf616c49268f7..f431bc7b1fc5819dd1aa732631a2f7fd3e67110e 100644 GIT binary patch literal 49167 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 mDIu6;VC@1i7^1E!suS4498>Hh(j?_W3o literal 29024 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 Xo)d}cWc5i%00000NkvXXu0mjfoQE1w diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index 06e274d0a..305abf481 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -16,8 +16,7 @@ class TestFileWebp(PillowTestCase): self.skipTest('WebP support not installed') return - # WebPAnimDecoder only returns RGBA or RGBX, never RGB - self.rgb_mode = "RGBX" if _webp.HAVE_WEBPANIM else "RGB" + self.rgb_mode = "RGB" def test_version(self): _webp.WebPDecoderVersion() @@ -29,8 +28,7 @@ class TestFileWebp(PillowTestCase): Does it have the bits we expect? """ - file_path = "Tests/images/hopper.webp" - image = Image.open(file_path) + image = Image.open("Tests/images/hopper.webp") self.assertEqual(image.mode, self.rgb_mode) self.assertEqual(image.size, (128, 128)) @@ -40,9 +38,7 @@ class TestFileWebp(PillowTestCase): # generated with: # dwebp -ppm ../../Tests/images/hopper.webp -o hopper_webp_bits.ppm - target = Image.open('Tests/images/hopper_webp_bits.ppm') - target = target.convert(self.rgb_mode) - self.assert_image_similar(image, target, 20.0) + self.assert_image_similar_tofile(image, 'Tests/images/hopper_webp_bits.ppm', 1.0) def test_write_rgb(self): """ @@ -61,13 +57,8 @@ class TestFileWebp(PillowTestCase): image.load() image.getdata() - # If we're using the exact same version of WebP, this test should pass. - # but it doesn't if the WebP is generated on Ubuntu and tested on - # Fedora. - # generated with: dwebp -ppm temp.webp -o hopper_webp_write.ppm - # target = Image.open('Tests/images/hopper_webp_write.ppm') - # self.assert_image_equal(image, target) + self.assert_image_similar_tofile(image, 'Tests/images/hopper_webp_write.ppm', 12.0) # This test asserts that the images are similar. If the average pixel # difference between the two images is less than the epsilon value, diff --git a/Tests/test_file_webp_lossless.py b/Tests/test_file_webp_lossless.py index 10354c55f..4c35dad73 100644 --- a/Tests/test_file_webp_lossless.py +++ b/Tests/test_file_webp_lossless.py @@ -19,8 +19,7 @@ class TestFileWebpLossless(PillowTestCase): if (_webp.WebPDecoderVersion() < 0x0200): self.skipTest('lossless not included') - # WebPAnimDecoder only returns RGBA or RGBX, never RGB - self.rgb_mode = "RGBX" if _webp.HAVE_WEBPANIM else "RGB" + self.rgb_mode = "RGB" def test_write_lossless_rgb(self): temp_file = self.tempfile("temp.webp") diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 39a8f2e35..1d8a0c10b 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -5,6 +5,7 @@ from io import BytesIO _VALID_WEBP_MODES = { "RGBX": True, "RGBA": True, + "RGB": True, } _VALID_WEBP_LEGACY_MODES = { @@ -63,7 +64,8 @@ class WebPImageFile(ImageFile.ImageFile): bgcolor & 0xFF self.info["background"] = (bg_r, bg_g, bg_b, bg_a) self._n_frames = frame_count - self.mode = mode + self.mode = 'RGB' if mode == 'RGBX' else mode + self.rawmode = mode self.tile = [] # Attempt to read ICC / EXIF / XMP chunks from file @@ -154,7 +156,7 @@ class WebPImageFile(ImageFile.ImageFile): # Set tile self.fp = BytesIO(data) - self.tile = [("raw", (0, 0) + self.size, 0, self.mode)] + self.tile = [("raw", (0, 0) + self.size, 0, self.rawmode)] return super(WebPImageFile, self).load() @@ -240,16 +242,23 @@ def _save_all(im, fp, filename): # Make sure image mode is supported frame = ims + rawmode = ims.mode if ims.mode not in _VALID_WEBP_MODES: - alpha = ims.mode == 'P' and 'A' in ims.im.getpalettemode() - frame = ims.convert('RGBA' if alpha else 'RGBX') + alpha = 'A' in ims.mode or 'a' in ims.mode \ + or ims.mode == 'P' and 'A' in ims.im.getpalettemode() + rawmode = 'RGBA' if alpha else 'RGBX' + frame = ims.convert(rawmode) + + if rawmode == 'RGB': + # For faster conversion, use RGBX + rawmode = 'RGBX' # Append the frame to the animation encoder enc.add( - frame.tobytes(), + frame.tobytes('raw', rawmode), timestamp, frame.size[0], frame.size[1], - frame.mode, + rawmode, lossless, quality, method @@ -288,7 +297,8 @@ def _save(im, fp, filename): xmp = im.encoderinfo.get("xmp", "") if im.mode not in _VALID_WEBP_LEGACY_MODES: - alpha = im.mode == 'P' and 'A' in im.im.getpalettemode() + alpha = 'A' in im.mode or 'a' in im.mode \ + or im.mode == 'P' and 'A' in im.im.getpalettemode() im = im.convert('RGBA' if alpha else 'RGB') data = _webp.WebPEncode( diff --git a/src/_webp.c b/src/_webp.c index f23d950f7..66b6d3268 100644 --- a/src/_webp.c +++ b/src/_webp.c @@ -216,6 +216,8 @@ PyObject* _anim_encoder_add(PyObject* self, PyObject* args) WebPPictureImportRGBA(frame, rgb, 4 * width); } else if (strcmp(mode, "RGBX")==0) { WebPPictureImportRGBX(frame, rgb, 4 * width); + } else { + WebPPictureImportRGB(frame, rgb, 3 * width); } // Add the frame to the encoder From 070436795244acd220f73cb8a0c5cf4dcb821647 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Sun, 12 Aug 2018 21:44:25 -0700 Subject: [PATCH 2/3] Add more parenthesis to make statement clearer --- src/PIL/WebPImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 1d8a0c10b..011570862 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -245,7 +245,7 @@ def _save_all(im, fp, filename): rawmode = ims.mode if ims.mode not in _VALID_WEBP_MODES: alpha = 'A' in ims.mode or 'a' in ims.mode \ - or ims.mode == 'P' and 'A' in ims.im.getpalettemode() + or (ims.mode == 'P' and 'A' in ims.im.getpalettemode()) rawmode = 'RGBA' if alpha else 'RGBX' frame = ims.convert(rawmode) @@ -298,7 +298,7 @@ def _save(im, fp, filename): if im.mode not in _VALID_WEBP_LEGACY_MODES: alpha = 'A' in im.mode or 'a' in im.mode \ - or im.mode == 'P' and 'A' in im.im.getpalettemode() + or (im.mode == 'P' and 'A' in im.im.getpalettemode()) im = im.convert('RGBA' if alpha else 'RGB') data = _webp.WebPEncode( From f3edf52900d973ae6129e0c900d5e98911c1e6af Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Tue, 4 Sep 2018 11:00:29 -0700 Subject: [PATCH 3/3] Convert unsupported WebP mode to RGB as .convert supports more src modes --- src/PIL/WebPImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 011570862..1334f8d4d 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -246,7 +246,7 @@ def _save_all(im, fp, filename): if ims.mode not in _VALID_WEBP_MODES: alpha = 'A' in ims.mode or 'a' in ims.mode \ or (ims.mode == 'P' and 'A' in ims.im.getpalettemode()) - rawmode = 'RGBA' if alpha else 'RGBX' + rawmode = 'RGBA' if alpha else 'RGB' frame = ims.convert(rawmode) if rawmode == 'RGB':