Skip to content

Commit

Permalink
Fixed combining single duration across duplicate PNG frames
Browse files Browse the repository at this point in the history
  • Loading branch information
radarhere committed May 9, 2023
1 parent 2a274a4 commit 5f3fe8b
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 3 deletions.
6 changes: 6 additions & 0 deletions Tests/test_file_apng.py
Expand Up @@ -440,6 +440,12 @@ def test_apng_save_duration_loop(tmp_path):
assert im.n_frames == 1
assert im.info.get("duration") == 750

# test removal of duplicated frames with a single duration
frame.save(test_file, save_all=True, append_images=[frame, frame], duration=500)
with Image.open(test_file) as im:
assert im.n_frames == 1
assert im.info.get("duration") == 1500

# test info duration
frame.info["duration"] = 750
frame.save(test_file, save_all=True)
Expand Down
9 changes: 6 additions & 3 deletions src/PIL/PngImagePlugin.py
Expand Up @@ -1146,11 +1146,14 @@ def _write_multiple_frames(im, fp, chunk, rawmode, default_image, append_images)
and prev_disposal == encoderinfo.get("disposal")
and prev_blend == encoderinfo.get("blend")
):
if isinstance(duration, (list, tuple)):
previous["encoderinfo"]["duration"] += encoderinfo["duration"]
previous["encoderinfo"]["duration"] += encoderinfo.get(
"duration", duration
)
continue
else:
bbox = None
if not "duration" in encoderinfo:
encoderinfo["duration"] = duration
im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo})

# animation control
Expand All @@ -1175,7 +1178,7 @@ def _write_multiple_frames(im, fp, chunk, rawmode, default_image, append_images)
im_frame = im_frame.crop(bbox)
size = im_frame.size
encoderinfo = frame_data["encoderinfo"]
frame_duration = int(round(encoderinfo.get("duration", duration)))
frame_duration = int(round(encoderinfo["duration"]))
frame_disposal = encoderinfo.get("disposal", disposal)
frame_blend = encoderinfo.get("blend", blend)
# frame control
Expand Down

0 comments on commit 5f3fe8b

Please sign in to comment.