Fixed combining single duration across duplicate PNG frames

This commit is contained in:
Andrew Murray 2023-05-09 12:12:16 +10:00
parent 2a274a4760
commit a0b691a219
2 changed files with 12 additions and 3 deletions

View File

@ -440,6 +440,12 @@ def test_apng_save_duration_loop(tmp_path):
assert im.n_frames == 1 assert im.n_frames == 1
assert im.info.get("duration") == 750 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 # test info duration
frame.info["duration"] = 750 frame.info["duration"] = 750
frame.save(test_file, save_all=True) frame.save(test_file, save_all=True)

View File

@ -1146,11 +1146,14 @@ def _write_multiple_frames(im, fp, chunk, rawmode, default_image, append_images)
and prev_disposal == encoderinfo.get("disposal") and prev_disposal == encoderinfo.get("disposal")
and prev_blend == encoderinfo.get("blend") and prev_blend == encoderinfo.get("blend")
): ):
if isinstance(duration, (list, tuple)): previous["encoderinfo"]["duration"] += encoderinfo.get(
previous["encoderinfo"]["duration"] += encoderinfo["duration"] "duration", duration
)
continue continue
else: else:
bbox = None bbox = None
if "duration" not in encoderinfo:
encoderinfo["duration"] = duration
im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo}) im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo})
# animation control # animation control
@ -1175,7 +1178,7 @@ def _write_multiple_frames(im, fp, chunk, rawmode, default_image, append_images)
im_frame = im_frame.crop(bbox) im_frame = im_frame.crop(bbox)
size = im_frame.size size = im_frame.size
encoderinfo = frame_data["encoderinfo"] 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_disposal = encoderinfo.get("disposal", disposal)
frame_blend = encoderinfo.get("blend", blend) frame_blend = encoderinfo.get("blend", blend)
# frame control # frame control