From ae194096d064d6dd02d2a0cfa147fa4730d81f57 Mon Sep 17 00:00:00 2001 From: Riley Lahd Date: Fri, 8 Mar 2019 12:48:22 -0700 Subject: [PATCH 01/43] Allow correct delta generation for GIFs with disposal 2 (Fixes #3665) --- src/PIL/GifImagePlugin.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 2ebd8b248..44c32faeb 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -443,7 +443,10 @@ def _write_multiple_frames(im, fp, palette): if im_frames: # delta frame previous = im_frames[-1] - if _get_palette_bytes(im_frame) == \ + if encoderinfo["disposal"] == 2: + # If diposing whole frame, treat full new frame as delta + delta = im_frame + elif _get_palette_bytes(im_frame) == \ _get_palette_bytes(previous['im']): delta = ImageChops.subtract_modulo(im_frame, previous['im']) From 1f6d1be7fc609ae436b8ab9e8674ba05163ed8e9 Mon Sep 17 00:00:00 2001 From: Riley Lahd Date: Fri, 8 Mar 2019 12:57:53 -0700 Subject: [PATCH 02/43] Ensure disposal key exists before checking --- src/PIL/GifImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 44c32faeb..7ba178d39 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -443,7 +443,7 @@ def _write_multiple_frames(im, fp, palette): if im_frames: # delta frame previous = im_frames[-1] - if encoderinfo["disposal"] == 2: + if "disposal" in encoderinfo and encoderinfo["disposal"] == 2: # If diposing whole frame, treat full new frame as delta delta = im_frame elif _get_palette_bytes(im_frame) == \ From 4a2be2af2d74e049cf53aa894688cb6aecf22522 Mon Sep 17 00:00:00 2001 From: Riley Lahd Date: Fri, 8 Mar 2019 15:56:31 -0700 Subject: [PATCH 03/43] Create gif frame delta by subtracting 0x0 image if disposal is mode 2 --- src/PIL/GifImagePlugin.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 7ba178d39..d6fd27440 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -443,9 +443,11 @@ def _write_multiple_frames(im, fp, palette): if im_frames: # delta frame previous = im_frames[-1] - if "disposal" in encoderinfo and encoderinfo["disposal"] == 2: - # If diposing whole frame, treat full new frame as delta - delta = im_frame + if encoderinfo["disposal"] == 2: + # Entire frame should be delta + # Create delta by subtracting empty image from frame (This is required) + delta = ImageChops.subtract_modulo( + im_frame, Image.new('P', (0,0))) elif _get_palette_bytes(im_frame) == \ _get_palette_bytes(previous['im']): delta = ImageChops.subtract_modulo(im_frame, From c73da62ce949547b1ec6ac32027de6f1708c422b Mon Sep 17 00:00:00 2001 From: Sir Cinnamon Date: Fri, 8 Mar 2019 16:34:44 -0700 Subject: [PATCH 04/43] Ensure disposal key exists before checking --- src/PIL/GifImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index d6fd27440..776875138 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -443,7 +443,7 @@ def _write_multiple_frames(im, fp, palette): if im_frames: # delta frame previous = im_frames[-1] - if encoderinfo["disposal"] == 2: + if "disposal" in encoderinfo and encoderinfo["disposal"] == 2: # Entire frame should be delta # Create delta by subtracting empty image from frame (This is required) delta = ImageChops.subtract_modulo( From 3b1a1fbfd2863be6141fc024ff69e23bd70ffdc1 Mon Sep 17 00:00:00 2001 From: Riley Lahd Date: Mon, 11 Mar 2019 07:41:14 -0600 Subject: [PATCH 05/43] Create background image for calculating gif deltas --- src/PIL/GifImagePlugin.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index d6fd27440..f301a09eb 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -443,20 +443,20 @@ def _write_multiple_frames(im, fp, palette): if im_frames: # delta frame previous = im_frames[-1] - if encoderinfo["disposal"] == 2: - # Entire frame should be delta - # Create delta by subtracting empty image from frame (This is required) - delta = ImageChops.subtract_modulo( - im_frame, Image.new('P', (0,0))) - elif _get_palette_bytes(im_frame) == \ - _get_palette_bytes(previous['im']): + if ("disposal" in im.encoderinfo and im.encoderinfo["disposal"] == 2): + base_image = background + else: + base_image = previous["im"] + + if _get_palette_bytes(im_frame) == \ + _get_palette_bytes(base_image): delta = ImageChops.subtract_modulo(im_frame, - previous['im']) + base_image) else: delta = ImageChops.subtract_modulo( - im_frame.convert('RGB'), previous['im'].convert('RGB')) + im_frame.convert('RGB'), base_image.convert('RGB')) bbox = delta.getbbox() - if not bbox: + if not bbox and not ("disposal" in im.encoderinfo and im.encoderinfo["disposal"] == 2): # This frame is identical to the previous frame if duration: previous['encoderinfo']['duration'] += \ @@ -464,6 +464,7 @@ def _write_multiple_frames(im, fp, palette): continue else: bbox = None + background = Image.new("P", im_frame.size, 0) im_frames.append({ 'im': im_frame, 'bbox': bbox, From 3b74281a2ff91d807fbdcea864374cef58b34124 Mon Sep 17 00:00:00 2001 From: Riley Lahd Date: Mon, 11 Mar 2019 07:55:37 -0600 Subject: [PATCH 06/43] Fix line lengths and init background out of loop --- src/PIL/GifImagePlugin.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index f301a09eb..9d0ce5404 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -423,6 +423,7 @@ def _write_multiple_frames(im, fp, palette): im_frames = [] frame_count = 0 + background = None for imSequence in itertools.chain([im], im.encoderinfo.get("append_images", [])): for im_frame in ImageSequence.Iterator(imSequence): @@ -443,20 +444,21 @@ def _write_multiple_frames(im, fp, palette): if im_frames: # delta frame previous = im_frames[-1] - if ("disposal" in im.encoderinfo and im.encoderinfo["disposal"] == 2): + if ("disposal" in im.encoderinfo \ + and im.encoderinfo["disposal"] == 2): base_image = background else: base_image = previous["im"] if _get_palette_bytes(im_frame) == \ _get_palette_bytes(base_image): - delta = ImageChops.subtract_modulo(im_frame, - base_image) + delta = ImageChops.subtract_modulo(im_frame, base_image) else: delta = ImageChops.subtract_modulo( im_frame.convert('RGB'), base_image.convert('RGB')) bbox = delta.getbbox() - if not bbox and not ("disposal" in im.encoderinfo and im.encoderinfo["disposal"] == 2): + if not bbox and not ("disposal" in im.encoderinfo \ + and im.encoderinfo["disposal"] == 2): # This frame is identical to the previous frame if duration: previous['encoderinfo']['duration'] += \ From 583d731a967c2e1d9b0bfe31bc1e36696115a866 Mon Sep 17 00:00:00 2001 From: Riley Lahd Date: Mon, 11 Mar 2019 08:02:04 -0600 Subject: [PATCH 07/43] Fix line indents for linting --- src/PIL/GifImagePlugin.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 9d0ce5404..dafe6a3f9 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -444,8 +444,8 @@ def _write_multiple_frames(im, fp, palette): if im_frames: # delta frame previous = im_frames[-1] - if ("disposal" in im.encoderinfo \ - and im.encoderinfo["disposal"] == 2): + if "disposal" in im.encoderinfo \ + and im.encoderinfo["disposal"] == 2: base_image = background else: base_image = previous["im"] @@ -457,8 +457,8 @@ def _write_multiple_frames(im, fp, palette): delta = ImageChops.subtract_modulo( im_frame.convert('RGB'), base_image.convert('RGB')) bbox = delta.getbbox() - if not bbox and not ("disposal" in im.encoderinfo \ - and im.encoderinfo["disposal"] == 2): + if not bbox and not ("disposal" in im.encoderinfo + and im.encoderinfo["disposal"] == 2): # This frame is identical to the previous frame if duration: previous['encoderinfo']['duration'] += \ From 96c5a4c5438c9f95acb47c530935e9abc8d1c31a Mon Sep 17 00:00:00 2001 From: Riley Lahd Date: Thu, 14 Mar 2019 14:40:31 -0600 Subject: [PATCH 08/43] Add test for disposal mode 2 gifs --- Tests/test_file_gif.py | 51 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 6a4b14d40..9b0d61541 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -1,6 +1,6 @@ from .helper import unittest, PillowTestCase, hopper, netpbm_available -from PIL import Image, ImagePalette, GifImagePlugin +from PIL import Image, ImagePalette, GifImagePlugin, ImageDraw from io import BytesIO @@ -315,6 +315,55 @@ class TestFileGif(PillowTestCase): img.seek(img.tell() + 1) self.assertEqual(img.disposal_method, i+1) + def test_dispose2_diff(self): + out = self.tempfile('temp.gif') + # 4 backgrounds: White, Grey, Black, Red + im_list = [ + Image.new('RGB', (100, 100), '#fff'), + Image.new('RGB', (100, 100), '#999'), + Image.new('RGB', (100, 100), '#000'), + Image.new('RGB', (100, 100), '#f00'), + ] + # Red circle in center of each frame + for img in im_list: + d = ImageDraw.Draw(img) + d.ellipse([(40,40),(60,60)], fill='#f00') + + # check per frame disposal + im_list[0].save( + out, + save_all=True, + append_images=im_list[1:], + disposal=2 + ) + + img = Image.open(out) + top_left_pixels = [] + center_pixels = [] + + # # Get pixel in top left + # rgb_img = img.convert('RGB') + # r, g, b = rgb_img.getpixel((1,1)) + # top_left_pixels += [(r,g,b)] + # r, g, b = rgb_img.getpixel((50,50)) + # center_pixels += [(r,g,b)] + + for i in range(3): + rgb_img = img.convert('RGB') + # Get pixel in top left + r, g, b = rgb_img.getpixel((1,1)) + top_left_pixels += [(r,g,b)] + # Get pixel in center + r, g, b = rgb_img.getpixel((50,50)) + center_pixels += [(r,g,b)] + for prev in top_left_pixels[:i]: + # Change background every frame + self.assertNotEqual((r,g,b), prev) + for prev in center_pixels[:i]: + # Center remains red every frame + self.assertEqual((r,g,b), (255,0,0)) + img.seek(img.tell() + 1) + def test_iss634(self): img = Image.open("Tests/images/iss634.gif") # seek to the second frame From 8a36a15ebd8635e4d2be0ea4629d99c50628cb3b Mon Sep 17 00:00:00 2001 From: Riley Lahd Date: Thu, 14 Mar 2019 14:41:10 -0600 Subject: [PATCH 09/43] Force include colour table for disposal=2 gifs and pad colour table to be valid when flag is set --- src/PIL/GifImagePlugin.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index dafe6a3f9..13036b1b4 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -476,6 +476,9 @@ def _write_multiple_frames(im, fp, palette): if len(im_frames) > 1: for frame_data in im_frames: im_frame = frame_data['im'] + if("disposal" in frame_data["encoderinfo"] \ + and frame_data["encoderinfo"]["disposal"]==2): + frame_data['encoderinfo']['include_color_table'] = True if not frame_data['bbox']: # global header for s in _get_global_header(im_frame, @@ -585,6 +588,8 @@ def _write_local_header(fp, im, offset, flags): include_color_table = im.encoderinfo.get('include_color_table') if include_color_table: palette_bytes = _get_palette_bytes(im) + # If needed, expand palette to minimum size + while(len(palette_bytes)<9): palette_bytes = palette_bytes*2 color_table_size = _get_color_table_size(palette_bytes) if color_table_size: flags = flags | 128 # local color table flag From 53cfd19a44b49da1603608b747facc4d374678b5 Mon Sep 17 00:00:00 2001 From: Riley Lahd Date: Thu, 14 Mar 2019 14:44:15 -0600 Subject: [PATCH 10/43] Check encoder info for disposal mode --- src/PIL/GifImagePlugin.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 13036b1b4..1171c1fe1 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -444,8 +444,8 @@ def _write_multiple_frames(im, fp, palette): if im_frames: # delta frame previous = im_frames[-1] - if "disposal" in im.encoderinfo \ - and im.encoderinfo["disposal"] == 2: + if "disposal" in encoderinfo \ + and encoderinfo["disposal"] == 2: base_image = background else: base_image = previous["im"] @@ -457,8 +457,8 @@ def _write_multiple_frames(im, fp, palette): delta = ImageChops.subtract_modulo( im_frame.convert('RGB'), base_image.convert('RGB')) bbox = delta.getbbox() - if not bbox and not ("disposal" in im.encoderinfo - and im.encoderinfo["disposal"] == 2): + if not bbox and not ("disposal" in encoderinfo + and encoderinfo["disposal"] == 2): # This frame is identical to the previous frame if duration: previous['encoderinfo']['duration'] += \ From 85a07bb3852b76a5f205de27945ed3ee5a41b442 Mon Sep 17 00:00:00 2001 From: Riley Lahd Date: Thu, 14 Mar 2019 14:51:13 -0600 Subject: [PATCH 11/43] Linting changes --- Tests/test_file_gif.py | 22 +++++++--------------- src/PIL/GifImagePlugin.py | 7 ++++--- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 9b0d61541..7110e34e4 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -327,9 +327,8 @@ class TestFileGif(PillowTestCase): # Red circle in center of each frame for img in im_list: d = ImageDraw.Draw(img) - d.ellipse([(40,40),(60,60)], fill='#f00') + d.ellipse([(40, 40), (60, 60)], fill='#f00') - # check per frame disposal im_list[0].save( out, save_all=True, @@ -341,27 +340,20 @@ class TestFileGif(PillowTestCase): top_left_pixels = [] center_pixels = [] - # # Get pixel in top left - # rgb_img = img.convert('RGB') - # r, g, b = rgb_img.getpixel((1,1)) - # top_left_pixels += [(r,g,b)] - # r, g, b = rgb_img.getpixel((50,50)) - # center_pixels += [(r,g,b)] - for i in range(3): rgb_img = img.convert('RGB') # Get pixel in top left - r, g, b = rgb_img.getpixel((1,1)) - top_left_pixels += [(r,g,b)] + r, g, b = rgb_img.getpixel((1, 1)) + top_left_pixels += [(r, g, b)] # Get pixel in center - r, g, b = rgb_img.getpixel((50,50)) - center_pixels += [(r,g,b)] + r, g, b = rgb_img.getpixel((50, 50)) + center_pixels += [(r, g, b)] for prev in top_left_pixels[:i]: # Change background every frame - self.assertNotEqual((r,g,b), prev) + self.assertNotEqual((r, g, b), prev) for prev in center_pixels[:i]: # Center remains red every frame - self.assertEqual((r,g,b), (255,0,0)) + self.assertEqual((r, g, b), (255, 0, 0)) img.seek(img.tell() + 1) def test_iss634(self): diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 1171c1fe1..49417c303 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -476,8 +476,8 @@ def _write_multiple_frames(im, fp, palette): if len(im_frames) > 1: for frame_data in im_frames: im_frame = frame_data['im'] - if("disposal" in frame_data["encoderinfo"] \ - and frame_data["encoderinfo"]["disposal"]==2): + if("disposal" in frame_data["encoderinfo"] + and frame_data["encoderinfo"]["disposal"] == 2): frame_data['encoderinfo']['include_color_table'] = True if not frame_data['bbox']: # global header @@ -589,7 +589,8 @@ def _write_local_header(fp, im, offset, flags): if include_color_table: palette_bytes = _get_palette_bytes(im) # If needed, expand palette to minimum size - while(len(palette_bytes)<9): palette_bytes = palette_bytes*2 + while(len(palette_bytes) < 9): + palette_bytes = palette_bytes*2 color_table_size = _get_color_table_size(palette_bytes) if color_table_size: flags = flags | 128 # local color table flag From 0b630e06dc38b6b4ad301571979a35b1eee8c391 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 15 Mar 2019 10:29:33 +1100 Subject: [PATCH 12/43] Test that background colours read are equal to saved colours --- Tests/test_file_gif.py | 42 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 7110e34e4..21a22630e 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -317,18 +317,20 @@ class TestFileGif(PillowTestCase): def test_dispose2_diff(self): out = self.tempfile('temp.gif') + # 4 backgrounds: White, Grey, Black, Red - im_list = [ - Image.new('RGB', (100, 100), '#fff'), - Image.new('RGB', (100, 100), '#999'), - Image.new('RGB', (100, 100), '#000'), - Image.new('RGB', (100, 100), '#f00'), - ] - # Red circle in center of each frame - for img in im_list: + backgrounds = [(255, 255, 255), (153, 153, 153), (0, 0, 0), (255, 0, 0)] + + im_list = [] + for background in backgrounds: + img = Image.new('RGB', (100, 100), background) + + # Red circle in center of each frame d = ImageDraw.Draw(img) d.ellipse([(40, 40), (60, 60)], fill='#f00') + im_list.append(img) + im_list[0].save( out, save_all=True, @@ -337,24 +339,16 @@ class TestFileGif(PillowTestCase): ) img = Image.open(out) - top_left_pixels = [] - center_pixels = [] - for i in range(3): + for i, background in enumerate(backgrounds): + img.seek(i) rgb_img = img.convert('RGB') - # Get pixel in top left - r, g, b = rgb_img.getpixel((1, 1)) - top_left_pixels += [(r, g, b)] - # Get pixel in center - r, g, b = rgb_img.getpixel((50, 50)) - center_pixels += [(r, g, b)] - for prev in top_left_pixels[:i]: - # Change background every frame - self.assertNotEqual((r, g, b), prev) - for prev in center_pixels[:i]: - # Center remains red every frame - self.assertEqual((r, g, b), (255, 0, 0)) - img.seek(img.tell() + 1) + + # Check top left pixel matches background + self.assertEqual(rgb_img.getpixel((0, 0)), background) + + # Center remains red every frame + self.assertEqual(rgb_img.getpixel((50, 50)), (255, 0, 0)) def test_iss634(self): img = Image.open("Tests/images/iss634.gif") From 4b2746fc39afe17abcaf2096250e61bf784d631c Mon Sep 17 00:00:00 2001 From: Riley Lahd Date: Fri, 22 Mar 2019 08:19:01 -0600 Subject: [PATCH 13/43] Remove disposal 2 duplicate frame exemption and add true delta test --- Tests/test_file_gif.py | 63 ++++++++++++++++++++++++++++++++++----- src/PIL/GifImagePlugin.py | 3 +- 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 21a22630e..c754d6ed5 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -315,19 +315,19 @@ class TestFileGif(PillowTestCase): img.seek(img.tell() + 1) self.assertEqual(img.disposal_method, i+1) - def test_dispose2_diff(self): + def test_dispose2_palette(self): out = self.tempfile('temp.gif') # 4 backgrounds: White, Grey, Black, Red - backgrounds = [(255, 255, 255), (153, 153, 153), (0, 0, 0), (255, 0, 0)] + circles = [(255, 255, 255), (153, 153, 153), (0, 0, 0), (255, 0, 0)] im_list = [] - for background in backgrounds: - img = Image.new('RGB', (100, 100), background) + for circle in circles: + img = Image.new('RGB', (100, 100), (255,0,0)) # Red circle in center of each frame d = ImageDraw.Draw(img) - d.ellipse([(40, 40), (60, 60)], fill='#f00') + d.ellipse([(40, 40), (60, 60)], fill=circle) im_list.append(img) @@ -340,15 +340,62 @@ class TestFileGif(PillowTestCase): img = Image.open(out) - for i, background in enumerate(backgrounds): + for i, circle in enumerate(circles): img.seek(i) rgb_img = img.convert('RGB') # Check top left pixel matches background - self.assertEqual(rgb_img.getpixel((0, 0)), background) + self.assertEqual(rgb_img.getpixel((0, 0)), (255, 0, 0)) # Center remains red every frame - self.assertEqual(rgb_img.getpixel((50, 50)), (255, 0, 0)) + self.assertEqual(rgb_img.getpixel((50, 50)), circle) + + def test_dispose2_diff(self): + out = self.tempfile('temp.gif') + + # 4 frames: red/blue, red/red, blue/blue, red/blue + circles = [ + ((255, 0, 0, 255),(0, 0, 255, 255)), + ((255, 0, 0, 255),(255, 0, 0, 255)), + ((0, 0, 255, 255),(0, 0, 255, 255)), + ((255, 0, 0, 255),(0, 0, 255, 255)) + ] + + im_list = [] + for i in range(len(circles)): + # Transparent BG + img = Image.new('RGBA', (100, 100), (255,255,255,0)) + + # Two circles per frame + d = ImageDraw.Draw(img) + d.ellipse([(0, 30), (40, 70)], fill=circles[i][0]) + d.ellipse([(60, 30), (100, 70)], fill=circles[i][1]) + + im_list.append(img) + + im_list[0].save( + out, + save_all=True, + append_images=im_list[1:], + disposal=2, + transparency=0 + ) + + img = Image.open(out) + + for i, colours in enumerate(circles): + img.seek(i) + rgb_img = img.convert('RGBA') + + # Check left circle is correct colour + self.assertEqual(rgb_img.getpixel((20, 50)), colours[0]) + + # Check right circle is correct colour + self.assertEqual(rgb_img.getpixel((80, 50)), colours[1]) + + # Check BG is correct colour + self.assertEqual(rgb_img.getpixel((1, 1)), (255,255,255,0)) + def test_iss634(self): img = Image.open("Tests/images/iss634.gif") diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 49417c303..64ef63b2e 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -457,8 +457,7 @@ def _write_multiple_frames(im, fp, palette): delta = ImageChops.subtract_modulo( im_frame.convert('RGB'), base_image.convert('RGB')) bbox = delta.getbbox() - if not bbox and not ("disposal" in encoderinfo - and encoderinfo["disposal"] == 2): + if not bbox: # This frame is identical to the previous frame if duration: previous['encoderinfo']['duration'] += \ From ad70fc73cbd17da4fb28cb00303ec2a52f82ba38 Mon Sep 17 00:00:00 2001 From: Riley Lahd Date: Fri, 22 Mar 2019 08:26:16 -0600 Subject: [PATCH 14/43] Linting changes --- Tests/test_file_gif.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index c754d6ed5..36a2b2648 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -323,7 +323,7 @@ class TestFileGif(PillowTestCase): im_list = [] for circle in circles: - img = Image.new('RGB', (100, 100), (255,0,0)) + img = Image.new('RGB', (100, 100), (255, 0, 0)) # Red circle in center of each frame d = ImageDraw.Draw(img) @@ -355,16 +355,16 @@ class TestFileGif(PillowTestCase): # 4 frames: red/blue, red/red, blue/blue, red/blue circles = [ - ((255, 0, 0, 255),(0, 0, 255, 255)), - ((255, 0, 0, 255),(255, 0, 0, 255)), - ((0, 0, 255, 255),(0, 0, 255, 255)), - ((255, 0, 0, 255),(0, 0, 255, 255)) + ((255, 0, 0, 255), (0, 0, 255, 255)), + ((255, 0, 0, 255), (255, 0, 0, 255)), + ((0, 0, 255, 255), (0, 0, 255, 255)), + ((255, 0, 0, 255), (0, 0, 255, 255)) ] im_list = [] for i in range(len(circles)): # Transparent BG - img = Image.new('RGBA', (100, 100), (255,255,255,0)) + img = Image.new('RGBA', (100, 100), (255, 255, 255, 0)) # Two circles per frame d = ImageDraw.Draw(img) @@ -394,8 +394,7 @@ class TestFileGif(PillowTestCase): self.assertEqual(rgb_img.getpixel((80, 50)), colours[1]) # Check BG is correct colour - self.assertEqual(rgb_img.getpixel((1, 1)), (255,255,255,0)) - + self.assertEqual(rgb_img.getpixel((1, 1)), (255, 255, 255, 0)) def test_iss634(self): img = Image.open("Tests/images/iss634.gif") From 7443e6d36beec01674e36e6ee11424cbb0e8786e Mon Sep 17 00:00:00 2001 From: Riley Lahd Date: Tue, 9 Apr 2019 08:23:59 -0600 Subject: [PATCH 15/43] Clean up disposal flag check --- src/PIL/GifImagePlugin.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 64ef63b2e..4f4e62d6d 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -444,8 +444,7 @@ def _write_multiple_frames(im, fp, palette): if im_frames: # delta frame previous = im_frames[-1] - if "disposal" in encoderinfo \ - and encoderinfo["disposal"] == 2: + if disposal == 2: base_image = background else: base_image = previous["im"] From e0cbfb270886fb542bbb8ab7bbd77f24fb152770 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 23 Jun 2019 07:33:55 +1000 Subject: [PATCH 16/43] Consider I;16 pixel size when drawing --- Tests/images/imagedraw_rectangle_I.png | Bin 0 -> 181 bytes Tests/test_imagedraw.py | 13 +++++++++++++ src/libImaging/Draw.c | 16 ++++++++++++---- 3 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 Tests/images/imagedraw_rectangle_I.png diff --git a/Tests/images/imagedraw_rectangle_I.png b/Tests/images/imagedraw_rectangle_I.png new file mode 100644 index 0000000000000000000000000000000000000000..4e94f6943dd8eaac1d3be2b930b835358f1caaf9 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^DIhEWBp6sF#ZCjM8c!F;kcv5PZ|&r5aNuEZbSQD( z`^BBnrM)67Lv8z;v$nn<#Rt-#eVmxP`+v{o+WMNK(u$9*r>UR&(KJCy(bOrc= 0 && x < im->xsize && y >= 0 && y < im->ysize) - im->image8[y][x] = (UINT8) ink; + if (strncmp(im->mode, "I;16", 4) == 0) { + im->image8[y][x*2] = (UINT8) ink; + im->image8[y][x*2+1] = (UINT8) ink; + } else { + im->image8[y][x] = (UINT8) ink; + } } static inline void @@ -95,7 +100,7 @@ point32rgba(Imaging im, int x, int y, int ink) static inline void hline8(Imaging im, int x0, int y0, int x1, int ink) { - int tmp; + int tmp, pixelwidth; if (y0 >= 0 && y0 < im->ysize) { if (x0 > x1) @@ -108,8 +113,11 @@ hline8(Imaging im, int x0, int y0, int x1, int ink) return; else if (x1 >= im->xsize) x1 = im->xsize-1; - if (x0 <= x1) - memset(im->image8[y0] + x0, (UINT8) ink, x1 - x0 + 1); + if (x0 <= x1) { + pixelwidth = strncmp(im->mode, "I;16", 4) == 0 ? 2 : 1; + memset(im->image8[y0] + x0 * pixelwidth, (UINT8) ink, + (x1 - x0 + 1) * pixelwidth); + } } } From db4916849ec255a9f4312e02dced7b3f893471ea Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 23 Jun 2019 07:34:39 +1000 Subject: [PATCH 17/43] Added ImageSequence all_frames --- Tests/test_imagesequence.py | 22 ++++++++++++++++++++++ src/PIL/ImageSequence.py | 22 ++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/Tests/test_imagesequence.py b/Tests/test_imagesequence.py index 38645f133..5d90dc4c5 100644 --- a/Tests/test_imagesequence.py +++ b/Tests/test_imagesequence.py @@ -74,3 +74,25 @@ class TestImageSequence(PillowTestCase): im.seek(0) color2 = im.getpalette()[0:3] self.assertEqual(color1, color2) + + def test_all_frames(self): + # Test a single image + im = Image.open("Tests/images/iss634.gif") + ims = ImageSequence.all_frames(im) + + self.assertEqual(len(ims), 42) + for i, im_frame in enumerate(ims): + self.assertFalse(im_frame is im) + + im.seek(i) + self.assert_image_equal(im, im_frame) + + # Test a series of images + ims = ImageSequence.all_frames([im, hopper(), im]) + self.assertEqual(len(ims), 85) + + # Test an operation + ims = ImageSequence.all_frames(im, lambda im_frame: im_frame.rotate(90)) + for i, im_frame in enumerate(ims): + im.seek(i) + self.assert_image_equal(im.rotate(90), im_frame) diff --git a/src/PIL/ImageSequence.py b/src/PIL/ImageSequence.py index 84199fe27..f9be92d48 100644 --- a/src/PIL/ImageSequence.py +++ b/src/PIL/ImageSequence.py @@ -54,3 +54,25 @@ class Iterator(object): def next(self): return self.__next__() + + +def all_frames(im, func=None): + """ + Applies a given function to all frames in an image or a list of images. + The frames are returned as a list of separate images. + + :param im: An image, or a list of images. + :param func: The function to apply to all of the image frames. + :returns: A list of images. + """ + if not isinstance(im, list): + im = [im] + + ims = [] + for imSequence in im: + current = imSequence.tell() + + ims += [im_frame.copy() for im_frame in Iterator(imSequence)] + + imSequence.seek(current) + return [func(im) for im in ims] if func else ims From 4119d3015b29b3eac582a431173970bd33a44cdf Mon Sep 17 00:00:00 2001 From: Jeffery To Date: Thu, 2 May 2019 05:35:27 +0800 Subject: [PATCH 18/43] Include CPPFLAGS when searching for libraries This adds CPPFLAGS to the list of environment variables (currently CFLAGS and LDFLAGS) searched when looking for includes and library directories, as CPPFLAGS may also include -I options. --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 5ccf7133d..2c25543a9 100755 --- a/setup.py +++ b/setup.py @@ -386,8 +386,8 @@ class pil_build_ext(build_ext): _add_directory(library_dirs, lib_root) _add_directory(include_dirs, include_root) - # respect CFLAGS/LDFLAGS - for k in ("CFLAGS", "LDFLAGS"): + # respect CFLAGS/CPPFLAGS/LDFLAGS + for k in ("CFLAGS", "CPPFLAGS", "LDFLAGS"): if k in os.environ: for match in re.finditer(r"-I([^\s]+)", os.environ[k]): _add_directory(include_dirs, match.group(1)) From cb7d9bcd1213cae7fbb659402a0c87ebb91d204b Mon Sep 17 00:00:00 2001 From: David Nisson Date: Tue, 16 Apr 2019 21:20:29 -0700 Subject: [PATCH 19/43] updated TIFF tile descriptors to match current decoding functionality --- src/PIL/TiffImagePlugin.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 7596aae65..91da55882 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1328,8 +1328,8 @@ class TiffImageFile(ImageFile.ImageFile): # Offset in the tile tuple is 0, we go from 0,0 to # w,h, and we only do this once -- eds - a = (rawmode, self._compression, False) - self.tile.append((self._compression, (0, 0, xsize, ysize), 0, a)) + a = (rawmode, self._compression, False, self.tag_v2.offset) + self.tile.append(("libtiff", (0, 0, xsize, ysize), 0, a)) elif STRIPOFFSETS in self.tag_v2 or TILEOFFSETS in self.tag_v2: # striped image @@ -1356,10 +1356,10 @@ class TiffImageFile(ImageFile.ImageFile): # adjust stride width accordingly stride /= bps_count - a = (tile_rawmode, int(stride), 1) + a = (tile_rawmode, int(stride), 1, offset.offset) self.tile.append( ( - self._compression, + "libtiff", (x, y, min(x + w, xsize), min(y + h, ysize)), offset, a, From 5857bf8243cbd64d1ee779cfee408f9f46121dd9 Mon Sep 17 00:00:00 2001 From: David Nisson Date: Tue, 16 Apr 2019 22:01:21 -0700 Subject: [PATCH 20/43] corrected args to reflect change to tile descriptors --- src/PIL/TiffImagePlugin.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 91da55882..835c460a5 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1121,7 +1121,7 @@ class TiffImageFile(ImageFile.ImageFile): # (self._compression, (extents tuple), # 0, (rawmode, self._compression, fp)) extents = self.tile[0][1] - args = list(self.tile[0][3]) + [self.tag_v2.offset] + args = list(self.tile[0][3]) # To be nice on memory footprint, if there's a # file descriptor, use that instead of reading @@ -1356,10 +1356,10 @@ class TiffImageFile(ImageFile.ImageFile): # adjust stride width accordingly stride /= bps_count - a = (tile_rawmode, int(stride), 1, offset.offset) + a = (tile_rawmode, int(stride), 1) self.tile.append( ( - "libtiff", + self._compression, (x, y, min(x + w, xsize), min(y + h, ysize)), offset, a, From ddb61cfbd2c39f7a1877dd37403aea0836693a6c Mon Sep 17 00:00:00 2001 From: David Nisson Date: Tue, 16 Apr 2019 22:42:21 -0700 Subject: [PATCH 21/43] updated tests to match new tile descriptors --- Tests/test_file_libtiff.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index dedcc179a..5bbceddbf 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -121,7 +121,7 @@ class TestFileLibTiff(LibTiffTestCase): self.assertEqual(im.mode, "RGB") self.assertEqual(im.size, (278, 374)) - self.assertEqual(im.tile[0][:3], ("tiff_adobe_deflate", (0, 0, 278, 374), 0)) + self.assertEqual(im.tile[0][:3], ("libtiff", (0, 0, 278, 374), 0)) im.load() self.assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") @@ -661,7 +661,8 @@ class TestFileLibTiff(LibTiffTestCase): self.assertEqual(im.mode, "RGBA") self.assertEqual(im.size, (100, 40)) self.assertEqual( - im.tile, [("tiff_lzw", (0, 0, 100, 40), 0, ("RGBa;16N", "tiff_lzw", False))] + im.tile, + [("libtiff", (0, 0, 100, 40), 0, ("RGBa;16N", "tiff_lzw", False, 38236))], ) im.load() @@ -680,7 +681,7 @@ class TestFileLibTiff(LibTiffTestCase): self.assertEqual(im.mode, "RGB") self.assertEqual(im.size, (256, 256)) self.assertEqual( - im.tile, [("jpeg", (0, 0, 256, 256), 0, ("RGB", "jpeg", False))] + im.tile, [("libtiff", (0, 0, 256, 256), 0, ("RGB", "jpeg", False, 5122))] ) im.load() From d00e18b0179142a1b3542deccd9fc6c60c472821 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 23 Jun 2019 14:01:51 +1000 Subject: [PATCH 22/43] Updated test result --- Tests/test_file_libtiff.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 5bbceddbf..79955a5af 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -644,10 +644,10 @@ class TestFileLibTiff(LibTiffTestCase): im.tile, [ ( - "tiff_adobe_deflate", + "libtiff", (0, 0, 100, 40), 0, - ("RGB;16N", "tiff_adobe_deflate", False), + ("RGB;16N", "tiff_adobe_deflate", False, 8), ) ], ) From 6aba1df7275598a811643e7fcc2be4e5a1dfa4a0 Mon Sep 17 00:00:00 2001 From: nulano Date: Sun, 7 Apr 2019 21:56:57 +0200 Subject: [PATCH 23/43] update Py_UNICODE to Py_UCS4 --- src/_imagingft.c | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/_imagingft.c b/src/_imagingft.c index f6bd787ef..291d745d7 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -326,6 +326,7 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) static int font_getchar(PyObject* string, int index, FT_ULong* char_out) { +#if PY_VERSION_HEX < 0x03000000 if (PyUnicode_Check(string)) { Py_UNICODE* p = PyUnicode_AS_UNICODE(string); int size = PyUnicode_GET_SIZE(string); @@ -335,7 +336,6 @@ font_getchar(PyObject* string, int index, FT_ULong* char_out) return 1; } -#if PY_VERSION_HEX < 0x03000000 if (PyString_Check(string)) { unsigned char* p = (unsigned char*) PyString_AS_STRING(string); int size = PyString_GET_SIZE(string); @@ -344,6 +344,13 @@ font_getchar(PyObject* string, int index, FT_ULong* char_out) *char_out = (unsigned char) p[index]; return 1; } +#else + if (PyUnicode_Check(string)) { + if (index >= PyUnicode_GetLength(string)) + return 0; + *char_out = PyUnicode_ReadChar(string, index); + return 1; + } #endif return 0; @@ -365,6 +372,7 @@ text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject * goto failed; } +#if PY_VERSION_HEX < 0x03000000 if (PyUnicode_Check(string)) { Py_UNICODE *text = PyUnicode_AS_UNICODE(string); Py_ssize_t size = PyUnicode_GET_SIZE(string); @@ -384,9 +392,7 @@ text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject * } } - } -#if PY_VERSION_HEX < 0x03000000 - else if (PyString_Check(string)) { + } else if (PyString_Check(string)) { char *text = PyString_AS_STRING(string); int size = PyString_GET_SIZE(string); if (! size) { @@ -403,6 +409,28 @@ text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject * } } } +#else + if (PyUnicode_Check(string)) { + Py_UCS4 *text = PyUnicode_AsUCS4Copy(string); + Py_ssize_t size = PyUnicode_GetLength(string); + if (!text || !size) { + /* return 0 and clean up, no glyphs==no size, + and raqm fails with empty strings */ + goto failed; + } + int set_text = (*p_raqm.set_text)(rq, (const uint32_t *)(text), size); + PyMem_Free(text); + if (!set_text) { + PyErr_SetString(PyExc_ValueError, "raqm_set_text() failed"); + goto failed; + } + if (lang) { + if (!(*p_raqm.set_language)(rq, lang, start, size)) { + PyErr_SetString(PyExc_ValueError, "raqm_set_language() failed"); + goto failed; + } + } + } #endif else { PyErr_SetString(PyExc_TypeError, "expected string"); From 92ff050bf9d356657663ac6c3cf98429040e123e Mon Sep 17 00:00:00 2001 From: nulano Date: Sun, 7 Apr 2019 22:12:25 +0200 Subject: [PATCH 24/43] replace PyUnicode_GetLength and PyUnicode_ReadChar with macro versions --- src/_imagingft.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/_imagingft.c b/src/_imagingft.c index 291d745d7..0235795ca 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -346,9 +346,9 @@ font_getchar(PyObject* string, int index, FT_ULong* char_out) } #else if (PyUnicode_Check(string)) { - if (index >= PyUnicode_GetLength(string)) + if (index >= PyUnicode_GET_LENGTH(string)) return 0; - *char_out = PyUnicode_ReadChar(string, index); + *char_out = PyUnicode_READ_CHAR(string, index); return 1; } #endif @@ -412,7 +412,7 @@ text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject * #else if (PyUnicode_Check(string)) { Py_UCS4 *text = PyUnicode_AsUCS4Copy(string); - Py_ssize_t size = PyUnicode_GetLength(string); + Py_ssize_t size = PyUnicode_GET_LENGTH(string); if (!text || !size) { /* return 0 and clean up, no glyphs==no size, and raqm fails with empty strings */ From 5f65f101918ac06c2259a7ddb45eac588fa90f43 Mon Sep 17 00:00:00 2001 From: nulano Date: Mon, 8 Apr 2019 07:05:30 +0200 Subject: [PATCH 25/43] add test for #3777 --- Tests/fonts/LICENSE.txt | 2 +- Tests/fonts/NotoSansSymbols-Regular.ttf | Bin 0 -> 256260 bytes Tests/images/unicode_extended.png | Bin 0 -> 999 bytes Tests/test_imagefont.py | 12 ++++++++++++ 4 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 Tests/fonts/NotoSansSymbols-Regular.ttf create mode 100644 Tests/images/unicode_extended.png diff --git a/Tests/fonts/LICENSE.txt b/Tests/fonts/LICENSE.txt index 0e0baaabb..726d5d797 100644 --- a/Tests/fonts/LICENSE.txt +++ b/Tests/fonts/LICENSE.txt @@ -1,5 +1,5 @@ -NotoNastaliqUrdu-Regular.ttf, from https://github.com/googlei18n/noto-fonts +NotoNastaliqUrdu-Regular.ttf and NotoSansSymbols-Regular.ttf, from https://github.com/googlei18n/noto-fonts NotoSansJP-Thin.otf, from https://www.google.com/get/noto/help/cjk/ AdobeVFPrototype.ttf, from https://github.com/adobe-fonts/adobe-variable-font-prototype TINY5x3GX.ttf, from http://velvetyne.fr/fonts/tiny diff --git a/Tests/fonts/NotoSansSymbols-Regular.ttf b/Tests/fonts/NotoSansSymbols-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..92accef72d46f519e5c11532ef5fed2312d935f0 GIT binary patch literal 256260 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�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 SCZCjoD`<>c8gp}V>Hh(XFgnlx literal 0 HcmV?d00001 diff --git a/Tests/images/unicode_extended.png b/Tests/images/unicode_extended.png new file mode 100644 index 0000000000000000000000000000000000000000..c0ffad3c69e7d2ffcf7589a3a7559888d7666772 GIT binary patch literal 999 zcmVes?>RE}FmvZzLJ&d-A%qY@2qAE&{;r z?k)g~j*cn=R4P?07L(VdP$-OzjS)hgo}T36u~hGCQee!pK{k;}_VlgVTSiAkkW@^Wl$ZflMq|2+TtJ~Y#uC6ZS zoy^Y8rc$Zauds!VkB=*r%HZH2A!KT53IKw^pgh26G*+us`2q8qH(Y(LE*E||7m#gk}-l$jr;BvX7 z+(Mxs{ngyu901h)2#AWsqLlk@YHFwS`Fs>bu`DZImdoYS(^HSfGcqzF#nf!r%>V!? zSNcr|u~;nSa#>!!UvfLn{r!F2r)FnoM~Z3TYZwd$0iaP!)zPn^+wBH`L?W^Oclmt& z^Yc^Q6Q$GX=8ILcNy|5Qo6W}aJj=2MgTZRG&dkinBRhJ7XIT~ihKGl1##dHW06_i~ z4+H|u7pvy;U(-5_kB=vl$x^9QEEXe?h!ob*twV2bFVFMIWKub0u~@#pzY~dsG$J;Z z%@j-7SSp*+x;nZkU07HEMVBDCxVQiShr=O_h({LX^Cj2l$Rg$*931rY^eAVwS}n`6 z9ev!%WHN#v=ybZevy+pP0I;>SB_Gu5^^r)VQKf!A42!wX&(BLsOAd#Fq9}@@91h3w z^76~e%m3*h{f~IP-u?Z3j^hMD5CkEY%P|b&@p#&uix5HxA%qY@2qA Date: Mon, 8 Apr 2019 14:49:49 +0200 Subject: [PATCH 26/43] fix lint --- Tests/test_imagefont.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 3e63a9e2b..11d2980fc 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -461,15 +461,18 @@ class TestImageFont(PillowTestCase): @unittest.skipIf(sys.platform.startswith('win32') and sys.version.startswith('2'), "requires Python 3.x on Windows") - def test_unicode_render(self): + def test_unicode_extended(self): # issue #3777 text = u"A\u278A\U0001F12B" + target = "Tests/images/unicode_extended.png" + ttf = ImageFont.truetype("Tests/fonts/NotoSansSymbols-Regular.ttf", FONT_SIZE, layout_engine=self.LAYOUT_ENGINE) img = Image.new("RGB", (100, 60)) d = ImageDraw.Draw(img) d.text((10, 10), text, font=ttf) - self.assert_image_similar_tofile(img, "Tests/images/unicode_extended.png", self.metrics['textsize']) + + self.assert_image_similar_tofile(img, target, self.metrics['textsize']) def _test_fake_loading_font(self, path_to_fake, fontname): # Make a copy of FreeTypeFont so we can patch the original From 983371d4d89d350d9348f596898f94c2e6eb4cdf Mon Sep 17 00:00:00 2001 From: nulano Date: Mon, 8 Apr 2019 15:16:27 +0200 Subject: [PATCH 27/43] fix centos, amazon --- Tests/test_imagefont.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 11d2980fc..02a369077 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -472,7 +472,7 @@ class TestImageFont(PillowTestCase): d = ImageDraw.Draw(img) d.text((10, 10), text, font=ttf) - self.assert_image_similar_tofile(img, target, self.metrics['textsize']) + self.assert_image_similar_tofile(img, target, self.metrics['multiline']) def _test_fake_loading_font(self, path_to_fake, fontname): # Make a copy of FreeTypeFont so we can patch the original From 25cf1010eb15a40629a4a54cd4534e799c7dd994 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 25 Jun 2019 22:20:57 +1000 Subject: [PATCH 28/43] Lint fixes --- Tests/test_imagefont.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 02a369077..141ea84dd 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -459,20 +459,25 @@ class TestImageFont(PillowTestCase): with self.assertRaises(UnicodeEncodeError): font.getsize(u"’") - @unittest.skipIf(sys.platform.startswith('win32') and sys.version.startswith('2'), - "requires Python 3.x on Windows") + @unittest.skipIf( + sys.platform.startswith("win32") and sys.version.startswith("2"), + "requires Python 3.x on Windows", + ) def test_unicode_extended(self): # issue #3777 text = u"A\u278A\U0001F12B" target = "Tests/images/unicode_extended.png" - ttf = ImageFont.truetype("Tests/fonts/NotoSansSymbols-Regular.ttf", - FONT_SIZE, layout_engine=self.LAYOUT_ENGINE) + ttf = ImageFont.truetype( + "Tests/fonts/NotoSansSymbols-Regular.ttf", + FONT_SIZE, + layout_engine=self.LAYOUT_ENGINE, + ) img = Image.new("RGB", (100, 60)) d = ImageDraw.Draw(img) d.text((10, 10), text, font=ttf) - self.assert_image_similar_tofile(img, target, self.metrics['multiline']) + self.assert_image_similar_tofile(img, target, self.metrics["multiline"]) def _test_fake_loading_font(self, path_to_fake, fontname): # Make a copy of FreeTypeFont so we can patch the original From 2ebde32852d11390833d6408a21153a27562c514 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Thu, 27 Jun 2019 15:07:52 -0700 Subject: [PATCH 29/43] Use unsigned int to store TIFF IFD offsets --- src/decode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/decode.c b/src/decode.c index 10e740aaf..79133f48f 100644 --- a/src/decode.c +++ b/src/decode.c @@ -503,9 +503,9 @@ PyImaging_LibTiffDecoderNew(PyObject* self, PyObject* args) char* rawmode; char* compname; int fp; - int ifdoffset; + uint32 ifdoffset; - if (! PyArg_ParseTuple(args, "sssii", &mode, &rawmode, &compname, &fp, &ifdoffset)) + if (! PyArg_ParseTuple(args, "sssiI", &mode, &rawmode, &compname, &fp, &ifdoffset)) return NULL; TRACE(("new tiff decoder %s\n", compname)); From 129df60c4844224b949c202333b4133acd7c9942 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Thu, 27 Jun 2019 15:09:31 -0700 Subject: [PATCH 30/43] Use unsigned int to store TIFF IFD offsets --- src/libImaging/TiffDecode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 871b0bcdb..50bc2bfc2 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -147,7 +147,7 @@ void _tiffUnmapProc(thandle_t hdata, tdata_t base, toff_t size) { (void) hdata; (void) base; (void) size; } -int ImagingLibTiffInit(ImagingCodecState state, int fp, int offset) { +int ImagingLibTiffInit(ImagingCodecState state, int fp, uint32 offset) { TIFFSTATE *clientstate = (TIFFSTATE *)state->context; TRACE(("initing libtiff\n")); From 59e1328272a154685fc69aca3df6e8e4cdc4637e Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Thu, 27 Jun 2019 15:30:19 -0700 Subject: [PATCH 31/43] Use unsigned int to store TIFF IFD offsets --- src/libImaging/TiffDecode.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/TiffDecode.h b/src/libImaging/TiffDecode.h index e29a6c88f..1c1337715 100644 --- a/src/libImaging/TiffDecode.h +++ b/src/libImaging/TiffDecode.h @@ -43,7 +43,7 @@ typedef struct { -extern int ImagingLibTiffInit(ImagingCodecState state, int fp, int offset); +extern int ImagingLibTiffInit(ImagingCodecState state, int fp, uint32 offset); extern int ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp); extern int ImagingLibTiffMergeFieldInfo(ImagingCodecState state, TIFFDataType field_type, int key); extern int ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...); From 1abcada1c52c041347ac1882d66bf530ad645e73 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 29 Jun 2019 17:47:55 +1000 Subject: [PATCH 32/43] Added release notes [ci skip] --- docs/releasenotes/6.1.0.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/releasenotes/6.1.0.rst b/docs/releasenotes/6.1.0.rst index 98568fb52..783c4d323 100644 --- a/docs/releasenotes/6.1.0.rst +++ b/docs/releasenotes/6.1.0.rst @@ -11,6 +11,14 @@ An optional ``include_layered_windows`` parameter has been added to ``ImageGrab. defaulting to ``False``. If true, layered windows will be included in the resulting image on Windows. +ImageSequence.all_frames +^^^^^^^^^^^^^^^^^^^^^^^^ + +A new method to facilitate applying a given function to all frames in an image, or to +all frames in a list of images. The frames are returned as a list of separate images. +For example, ``ImageSequence.all_frames(im, lambda im_frame: im_frame.rotate(90))`` +could used to return all frames from an image, each rotated 90 degrees. + Variation fonts ^^^^^^^^^^^^^^^ From d2fdb4818c8e51e683f0f038846bd44882c815f8 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sat, 29 Jun 2019 18:02:08 +1000 Subject: [PATCH 33/43] Fixed wording Co-Authored-By: Hugo --- docs/releasenotes/6.1.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/6.1.0.rst b/docs/releasenotes/6.1.0.rst index 783c4d323..851dcb2d0 100644 --- a/docs/releasenotes/6.1.0.rst +++ b/docs/releasenotes/6.1.0.rst @@ -17,7 +17,7 @@ ImageSequence.all_frames A new method to facilitate applying a given function to all frames in an image, or to all frames in a list of images. The frames are returned as a list of separate images. For example, ``ImageSequence.all_frames(im, lambda im_frame: im_frame.rotate(90))`` -could used to return all frames from an image, each rotated 90 degrees. +could be used to return all frames from an image, each rotated 90 degrees. Variation fonts ^^^^^^^^^^^^^^^ From 3e4db05249dd4d409243668bcd377034bf40abc8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 29 Jun 2019 23:02:17 +1000 Subject: [PATCH 34/43] Removed code not required by tests --- src/PIL/GifImagePlugin.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index d6d646c59..d541483b8 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -471,9 +471,6 @@ def _write_multiple_frames(im, fp, palette): if len(im_frames) > 1: for frame_data in im_frames: im_frame = frame_data["im"] - if("disposal" in frame_data["encoderinfo"] - and frame_data["encoderinfo"]["disposal"] == 2): - frame_data['encoderinfo']['include_color_table'] = True if not frame_data["bbox"]: # global header for s in _get_global_header(im_frame, frame_data["encoderinfo"]): From 97c15a245c603f615417f28a9e4b31b06fe9060a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 29 Jun 2019 19:24:12 +1000 Subject: [PATCH 35/43] Corrected color table size calculation --- Tests/test_file_gif.py | 2 +- src/PIL/GifImagePlugin.py | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 1f0358bec..0c4a13a5b 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -59,7 +59,7 @@ class TestFileGif(PillowTestCase): return len(test_file.getvalue()) self.assertEqual(test_grayscale(0), 800) - self.assertEqual(test_grayscale(1), 38) + self.assertEqual(test_grayscale(1), 44) self.assertEqual(test_bilevel(0), 800) self.assertEqual(test_bilevel(1), 800) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index d541483b8..f55ca4471 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -580,9 +580,6 @@ def _write_local_header(fp, im, offset, flags): include_color_table = im.encoderinfo.get("include_color_table") if include_color_table: palette_bytes = _get_palette_bytes(im) - # If needed, expand palette to minimum size - while(len(palette_bytes) < 9): - palette_bytes = palette_bytes*2 color_table_size = _get_color_table_size(palette_bytes) if color_table_size: flags = flags | 128 # local color table flag @@ -693,10 +690,12 @@ def _get_color_table_size(palette_bytes): # calculate the palette size for the header import math - color_table_size = int(math.ceil(math.log(len(palette_bytes) // 3, 2))) - 1 - if color_table_size < 0: - color_table_size = 0 - return color_table_size + if not palette_bytes: + return 0 + elif len(palette_bytes) < 9: + return 1 + else: + return int(math.ceil(math.log(len(palette_bytes) // 3, 2))) - 1 def _get_header_palette(palette_bytes): From 90d3d3716457c1bf69fd4814759350fc46383c0d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 29 Jun 2019 23:06:45 +1000 Subject: [PATCH 36/43] Do not presume that the background color index is 0 --- Tests/test_file_gif.py | 52 +++++++++++++++++++++++++-------------- src/PIL/GifImagePlugin.py | 48 ++++++++++++++++++++++-------------- 2 files changed, 63 insertions(+), 37 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 0c4a13a5b..45409cbc6 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -319,14 +319,14 @@ class TestFileGif(PillowTestCase): self.assertEqual(img.disposal_method, i + 1) def test_dispose2_palette(self): - out = self.tempfile('temp.gif') + out = self.tempfile("temp.gif") # 4 backgrounds: White, Grey, Black, Red circles = [(255, 255, 255), (153, 153, 153), (0, 0, 0), (255, 0, 0)] im_list = [] for circle in circles: - img = Image.new('RGB', (100, 100), (255, 0, 0)) + img = Image.new("RGB", (100, 100), (255, 0, 0)) # Red circle in center of each frame d = ImageDraw.Draw(img) @@ -334,18 +334,13 @@ class TestFileGif(PillowTestCase): im_list.append(img) - im_list[0].save( - out, - save_all=True, - append_images=im_list[1:], - disposal=2 - ) + im_list[0].save(out, save_all=True, append_images=im_list[1:], disposal=2) img = Image.open(out) for i, circle in enumerate(circles): img.seek(i) - rgb_img = img.convert('RGB') + rgb_img = img.convert("RGB") # Check top left pixel matches background self.assertEqual(rgb_img.getpixel((0, 0)), (255, 0, 0)) @@ -354,20 +349,20 @@ class TestFileGif(PillowTestCase): self.assertEqual(rgb_img.getpixel((50, 50)), circle) def test_dispose2_diff(self): - out = self.tempfile('temp.gif') + out = self.tempfile("temp.gif") # 4 frames: red/blue, red/red, blue/blue, red/blue circles = [ ((255, 0, 0, 255), (0, 0, 255, 255)), ((255, 0, 0, 255), (255, 0, 0, 255)), ((0, 0, 255, 255), (0, 0, 255, 255)), - ((255, 0, 0, 255), (0, 0, 255, 255)) + ((255, 0, 0, 255), (0, 0, 255, 255)), ] im_list = [] for i in range(len(circles)): # Transparent BG - img = Image.new('RGBA', (100, 100), (255, 255, 255, 0)) + img = Image.new("RGBA", (100, 100), (255, 255, 255, 0)) # Two circles per frame d = ImageDraw.Draw(img) @@ -377,18 +372,14 @@ class TestFileGif(PillowTestCase): im_list.append(img) im_list[0].save( - out, - save_all=True, - append_images=im_list[1:], - disposal=2, - transparency=0 + out, save_all=True, append_images=im_list[1:], disposal=2, transparency=0 ) img = Image.open(out) for i, colours in enumerate(circles): img.seek(i) - rgb_img = img.convert('RGBA') + rgb_img = img.convert("RGBA") # Check left circle is correct colour self.assertEqual(rgb_img.getpixel((20, 50)), colours[0]) @@ -399,6 +390,31 @@ class TestFileGif(PillowTestCase): # Check BG is correct colour self.assertEqual(rgb_img.getpixel((1, 1)), (255, 255, 255, 0)) + def test_dispose2_background(self): + out = self.tempfile("temp.gif") + + im_list = [] + + im = Image.new("P", (100, 100)) + d = ImageDraw.Draw(im) + d.rectangle([(50, 0), (100, 100)], fill="#f00") + d.rectangle([(0, 0), (50, 100)], fill="#0f0") + im_list.append(im) + + im = Image.new("P", (100, 100)) + d = ImageDraw.Draw(im) + d.rectangle([(0, 0), (100, 50)], fill="#f00") + d.rectangle([(0, 50), (100, 100)], fill="#0f0") + im_list.append(im) + + im_list[0].save( + out, save_all=True, append_images=im_list[1:], disposal=[0, 2], background=1 + ) + + im = Image.open(out) + im.seek(1) + self.assertEqual(im.getpixel((0, 0)), 0) + def test_iss634(self): img = Image.open("Tests/images/iss634.gif") # seek to the second frame diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index f55ca4471..bbf1c603f 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -426,9 +426,8 @@ def _write_multiple_frames(im, fp, palette): im_frames = [] frame_count = 0 - background = None - for imSequence in itertools.chain([im], - im.encoderinfo.get("append_images", [])): + background_im = None + for imSequence in itertools.chain([im], im.encoderinfo.get("append_images", [])): for im_frame in ImageSequence.Iterator(imSequence): # a copy is required here since seek can still mutate the image im_frame = _normalize_mode(im_frame.copy()) @@ -447,16 +446,23 @@ def _write_multiple_frames(im, fp, palette): if im_frames: # delta frame previous = im_frames[-1] - if disposal == 2: - base_image = background + if encoderinfo.get("disposal") == 2: + if background_im is None: + background = _get_background( + im, + im.encoderinfo.get("background", im.info.get("background")), + ) + background_im = Image.new("P", im_frame.size, background) + background_im.putpalette(im_frames[0]["im"].palette) + base_im = background_im else: - base_image = previous["im"] - - if _get_palette_bytes(im_frame) == _get_palette_bytes(base_frame): - delta = ImageChops.subtract_modulo(im_frame, base_image) + base_im = previous["im"] + if _get_palette_bytes(im_frame) == _get_palette_bytes(base_im): + delta = ImageChops.subtract_modulo(im_frame, base_im) else: delta = ImageChops.subtract_modulo( - im_frame.convert("RGB"), base_image.convert("RGB")) + im_frame.convert("RGB"), base_im.convert("RGB") + ) bbox = delta.getbbox() if not bbox: # This frame is identical to the previous frame @@ -465,7 +471,6 @@ def _write_multiple_frames(im, fp, palette): continue else: bbox = None - background = Image.new("P", im_frame.size, 0) im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo}) if len(im_frames) > 1: @@ -726,6 +731,18 @@ def _get_palette_bytes(im): return im.palette.palette +def _get_background(im, infoBackground): + background = 0 + if infoBackground: + background = infoBackground + if isinstance(background, tuple): + # WebPImagePlugin stores an RGBA value in info["background"] + # So it must be converted to the same format as GifImagePlugin's + # info["background"] - a global color table index + background = im.palette.getcolor(background) + return background + + def _get_global_header(im, info): """Return a list of strings representing a GIF header""" @@ -745,14 +762,7 @@ def _get_global_header(im, info): if im.info.get("version") == b"89a": version = b"89a" - background = 0 - if "background" in info: - background = info["background"] - if isinstance(background, tuple): - # WebPImagePlugin stores an RGBA value in info["background"] - # So it must be converted to the same format as GifImagePlugin's - # info["background"] - a global color table index - background = im.palette.getcolor(background) + background = _get_background(im, info.get("background")) palette_bytes = _get_palette_bytes(im) color_table_size = _get_color_table_size(palette_bytes) From a7bdd6487fb6f7358aa47b625fe34b89782807cc Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 29 Jun 2019 23:09:35 +0300 Subject: [PATCH 37/43] Update CHANGES.rst --- CHANGES.rst | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index fcddd8da0..3789879e9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,27 @@ Changelog (Pillow) 6.1.0 (unreleased) ------------------ +- Create GIF deltas from background colour of GIF frames if disposal mode is 2 #3708 + [sircinnamon, radarhere] + +- Added ImageSequence all_frames #3778 + [radargere] + +- Use unsigned int to store TIFF IFD offsets #3923 + [cgohlke] + +- Include CPPFLAGS when searching for libraries #3819 + [jefferyto] + +- Updated TIFF tile descriptors to match current decoding functionality #3795 + [dmnisson] + +- Added an `image.entropy()` method (second revision) #3608 + [fish2000] + +- Pass the correct types to PyArg_ParseTuple #3880 + [QuLogic] + - Fixed crash when loading non-font bytes #3912 [radarhere] From d11aa4b21da1abe6cb0407923112015e15c348de Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Jun 2019 07:58:11 +1000 Subject: [PATCH 38/43] Fixed typo [ci skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 3789879e9..03c878dc9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -9,7 +9,7 @@ Changelog (Pillow) [sircinnamon, radarhere] - Added ImageSequence all_frames #3778 - [radargere] + [radarhere] - Use unsigned int to store TIFF IFD offsets #3923 [cgohlke] From a70da8112dc10713072e11552b3b7bbdcdb34d3d Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Thu, 27 Jun 2019 23:55:01 -0700 Subject: [PATCH 39/43] Add TIFFTAG_SAMPLEFORMAT to blocklist The SAMPLEFORMAT tag is determined by the image format and should not be copied from legacy_ifd. --- src/PIL/TiffImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 835c460a5..cf91211b2 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1540,7 +1540,7 @@ def _save(im, fp, filename): # STRIPOFFSETS and STRIPBYTECOUNTS are added by the library # based on the data in the strip. - blocklist = [STRIPOFFSETS, STRIPBYTECOUNTS] + blocklist = [STRIPOFFSETS, STRIPBYTECOUNTS, SAMPLEFORMAT] atts = {} # bits per sample is a single short in the tiff directory, not a list. atts[BITSPERSAMPLE] = bits[0] From 4a69223db98d31413466dbb348519c0f1e4da070 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Sat, 29 Jun 2019 16:09:53 -0700 Subject: [PATCH 40/43] Add test for sampleformat corruption --- Tests/test_file_tiff.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 945372f86..fa1aa49fa 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -587,6 +587,28 @@ class TestFileTiff(PillowTestCase): im.load() self.assertFalse(fp.closed) + def test_sampleformat_not_corrupted(self): + # Assert that a TIFF image with SampleFormat=UINT tag is not corrupted + # when saving to a new file. + # Pillow 6.0 fails with "OSError: cannot identify image file". + import base64 + tiff = BytesIO( + base64.b64decode( + b'SUkqAAgAAAAPAP4ABAABAAAAAAAAAAABBAABAAAAAQAAAAEBBAABAAAAAQAA' + b'AAIBAwADAAAAwgAAAAMBAwABAAAACAAAAAYBAwABAAAAAgAAABEBBAABAAAA' + b'4AAAABUBAwABAAAAAwAAABYBBAABAAAAAQAAABcBBAABAAAACwAAABoBBQAB' + b'AAAAyAAAABsBBQABAAAA0AAAABwBAwABAAAAAQAAACgBAwABAAAAAQAAAFMB' + b'AwADAAAA2AAAAAAAAAAIAAgACAABAAAAAQAAAAEAAAABAAAAAQABAAEAAAB4' + b'nGNgYAAAAAMAAQ==' + ) + ) + out = BytesIO() + with Image.open(tiff) as im: + im.save(out, format='tiff') + out.seek(0) + with Image.open(out) as im: + im.load() + @unittest.skipUnless(sys.platform.startswith("win32"), "Windows only") class TestFileTiffW32(PillowTestCase): From cc0d70145b3173c03d51e2cd59d3c81cafb13e0e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Jun 2019 13:11:05 +1000 Subject: [PATCH 41/43] Lint fixes --- Tests/test_file_tiff.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index fa1aa49fa..e241f6a6a 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -592,19 +592,20 @@ class TestFileTiff(PillowTestCase): # when saving to a new file. # Pillow 6.0 fails with "OSError: cannot identify image file". import base64 + tiff = BytesIO( base64.b64decode( - b'SUkqAAgAAAAPAP4ABAABAAAAAAAAAAABBAABAAAAAQAAAAEBBAABAAAAAQAA' - b'AAIBAwADAAAAwgAAAAMBAwABAAAACAAAAAYBAwABAAAAAgAAABEBBAABAAAA' - b'4AAAABUBAwABAAAAAwAAABYBBAABAAAAAQAAABcBBAABAAAACwAAABoBBQAB' - b'AAAAyAAAABsBBQABAAAA0AAAABwBAwABAAAAAQAAACgBAwABAAAAAQAAAFMB' - b'AwADAAAA2AAAAAAAAAAIAAgACAABAAAAAQAAAAEAAAABAAAAAQABAAEAAAB4' - b'nGNgYAAAAAMAAQ==' + b"SUkqAAgAAAAPAP4ABAABAAAAAAAAAAABBAABAAAAAQAAAAEBBAABAAAAAQAA" + b"AAIBAwADAAAAwgAAAAMBAwABAAAACAAAAAYBAwABAAAAAgAAABEBBAABAAAA" + b"4AAAABUBAwABAAAAAwAAABYBBAABAAAAAQAAABcBBAABAAAACwAAABoBBQAB" + b"AAAAyAAAABsBBQABAAAA0AAAABwBAwABAAAAAQAAACgBAwABAAAAAQAAAFMB" + b"AwADAAAA2AAAAAAAAAAIAAgACAABAAAAAQAAAAEAAAABAAAAAQABAAEAAAB4" + b"nGNgYAAAAAMAAQ==" ) ) out = BytesIO() with Image.open(tiff) as im: - im.save(out, format='tiff') + im.save(out, format="tiff") out.seek(0) with Image.open(out) as im: im.load() From 42588a649330b577bad686e20596c50b9fe4ad03 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Jun 2019 13:25:12 +1000 Subject: [PATCH 42/43] Skip test if libtiff is not installed --- Tests/test_file_tiff.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index e241f6a6a..3b0afba67 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -4,7 +4,7 @@ import sys from .helper import unittest, PillowTestCase, hopper -from PIL import Image, TiffImagePlugin +from PIL import Image, TiffImagePlugin, features from PIL._util import py3 from PIL.TiffImagePlugin import X_RESOLUTION, Y_RESOLUTION, RESOLUTION_UNIT @@ -587,6 +587,7 @@ class TestFileTiff(PillowTestCase): im.load() self.assertFalse(fp.closed) + @unittest.skipUnless(features.check("libtiff"), "libtiff not installed") def test_sampleformat_not_corrupted(self): # Assert that a TIFF image with SampleFormat=UINT tag is not corrupted # when saving to a new file. From a1eb07f27672e579f9dd13702e17e818049ffd43 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 30 Jun 2019 13:55:03 +0300 Subject: [PATCH 43/43] Update CHANGES.rst --- CHANGES.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 03c878dc9..b33c476d7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,15 @@ Changelog (Pillow) 6.1.0 (unreleased) ------------------ +- Update Py_UNICODE to Py_UCS4 #3780 + [nulano] + +- Consider I;16 pixel size when drawing #3899 + [radarhere] + +- Add TIFFTAG_SAMPLEFORMAT to blocklist #3926 + [cgohlke, radarhere] + - Create GIF deltas from background colour of GIF frames if disposal mode is 2 #3708 [sircinnamon, radarhere]