diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index a4d021f58a1..6d895402d87 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -472,7 +472,7 @@ def test_multiple_duration(self): except EOFError: pass - def test_partially_identical_frames(self): + def test_identical_frames(self): duration_list = [1000, 1500, 2000, 4000] out = self.tempfile("temp.gif") @@ -495,37 +495,23 @@ def test_partially_identical_frames(self): # Assert that the new duration is the total of the identical frames self.assertEqual(reread.info["duration"], 4500) - def test_totally_identical_frames(self): + def test_identical_frames_to_single_frame(self): duration_list = [1000, 1500, 2000, 4000] out = self.tempfile("temp.gif") - - image_path = "Tests/images/bc7-argb-8bpp_MipMaps-1.png" im_list = [ - Image.open(image_path), - Image.open(image_path), - Image.open(image_path), - Image.open(image_path), + Image.new("L", (100, 100), "#000"), + Image.new("L", (100, 100), "#000"), + Image.new("L", (100, 100), "#000"), ] - mask = Image.new("RGBA", im_list[0].size, (255, 255, 255, 0)) - - frames = [] - for image in im_list: - frames.append(Image.alpha_composite(mask, image)) # duration as list - frames[0].save( - out, - save_all=True, - append_images=frames[1:], - optimize=False, - duration=duration_list, - loop=0, - transparency=0, + im_list[0].save( + out, save_all=True, append_images=im_list[1:], duration=duration_list ) reread = Image.open(out) - # Assert that all four frames were combined + # Assert that all frames were combined self.assertEqual(reread.n_frames, 1) # Assert that the new duration is the total of the identical frames diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index d2f6cd1d33d..5f71a81ef29 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -472,9 +472,6 @@ def _write_multiple_frames(im, fp, palette): else: bbox = None im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo}) - # see: https://github.com/python-pillow/Pillow/issues/4002 - if len(im_frames) == 1 and "duration" in im_frames[0]["encoderinfo"]: - im.encoderinfo["duration"] = im_frames[0]["encoderinfo"]["duration"] if len(im_frames) > 1: for frame_data in im_frames: @@ -492,6 +489,9 @@ def _write_multiple_frames(im, fp, palette): offset = frame_data["bbox"][:2] _write_frame_data(fp, im_frame, offset, frame_data["encoderinfo"]) return True + elif "duration" in im.encoderinfo: + # Since multiple frames will not be written, add together the frame durations + im.encoderinfo["duration"] = sum(im.encoderinfo["duration"]) def _save_all(im, fp, filename):