From ec221cdbc57c0c7ae4c884f0793023e931591750 Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Mon, 2 Mar 2015 00:06:34 +0100 Subject: [PATCH] webp: add compression (lossless/lossy) to image info --- PIL/WebPImagePlugin.py | 1 + Tests/images/lossless-no-vp8x.webp | Bin 0 -> 50 bytes Tests/images/lossless-with-vp8x.webp | Bin 0 -> 10214 bytes Tests/test_file_webp.py | 12 ++++++++++++ Tests/test_file_webp_lossless.py | 1 + 5 files changed, 14 insertions(+) create mode 100644 Tests/images/lossless-no-vp8x.webp create mode 100644 Tests/images/lossless-with-vp8x.webp diff --git a/PIL/WebPImagePlugin.py b/PIL/WebPImagePlugin.py index fc86b4c0a..aadd5750d 100644 --- a/PIL/WebPImagePlugin.py +++ b/PIL/WebPImagePlugin.py @@ -153,6 +153,7 @@ class WebPImageFile(ImageFile.ImageFile): self.mode = mode self.size = size + self.info['compression'] = 'lossy' if lossy else 'lossless' self.tile = [('webp', (0, 0) + size, 0, # Decoder params: rawmode, has_alpha, width, height. (mode, 1 if 'RGBA' == mode else 0, size[0], size[1]))] diff --git a/Tests/images/lossless-no-vp8x.webp b/Tests/images/lossless-no-vp8x.webp new file mode 100644 index 0000000000000000000000000000000000000000..9de86d8f0150f09dbf0a37897e5c15748fc58e25 GIT binary patch literal 50 zcmWIYbaT^UU|5(5AL literal 0 HcmV?d00001 diff --git a/Tests/images/lossless-with-vp8x.webp b/Tests/images/lossless-with-vp8x.webp new file mode 100644 index 0000000000000000000000000000000000000000..4de0a11c9b05bc71830c437a76be3effe59e1c15 GIT binary patch literal 10214 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 Pu?~#~zo;nSq3u5a{5ES$ literal 0 HcmV?d00001 diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index 8c8313dd9..6c7ba98da 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -72,6 +72,18 @@ class TestFileWebp(PillowTestCase): target = hopper("RGB") self.assert_image_similar(image, target, 12) + def test_info_compression(self): + for name, compression in ( + ('flower2' , 'lossy'), + ('flower' , 'lossy'), + ('hopper' , 'lossy'), + ('lossless-no-vp8x' , 'lossless'), + ('lossless-with-vp8x', 'lossless'), + ('transparent' , 'lossy'), + ): + image = Image.open('Tests/images/%s.webp' % name) + self.assertEqual(image.info['compression'], compression) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_webp_lossless.py b/Tests/test_file_webp_lossless.py index 52a461a74..4996e367e 100644 --- a/Tests/test_file_webp_lossless.py +++ b/Tests/test_file_webp_lossless.py @@ -31,6 +31,7 @@ class TestFileWebpLossless(PillowTestCase): self.assertEqual(image.mode, "RGB") self.assertEqual(image.size, (128, 128)) self.assertEqual(image.format, "WEBP") + self.assertEqual(image.info['compression'], 'lossless') image.load() image.getdata()