From e37e07c56518363451269c0c80589976a5c9c82e Mon Sep 17 00:00:00 2001 From: cidoku Date: Fri, 14 Feb 2025 23:21:27 -0300 Subject: [PATCH] make apng support more robust by using delay denominator --- apng_test.py | 28 ++++++++++++++++++++++++++++ images.py | 10 ++++++---- 2 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 apng_test.py diff --git a/apng_test.py b/apng_test.py new file mode 100644 index 0000000..17dfffd --- /dev/null +++ b/apng_test.py @@ -0,0 +1,28 @@ +from apng import APNG + +print "image1" + +img = APNG.open("image.apng") + +for png, control in img.frames: + print "---------" + print control.delay + print control.delay_den + +print "image2" + +img = APNG.open("shocked.apng") + +for png, control in img.frames: + print "---------" + print control.delay + print control.delay_den + +print "image3" + +img = APNG.open("(a)mad.apng") + +for png, control in img.frames: + print "---------" + print control.delay + print control.delay_den \ No newline at end of file diff --git a/images.py b/images.py index f1ebec9..35775f7 100644 --- a/images.py +++ b/images.py @@ -34,8 +34,6 @@ def load_apng(file): # this one was hell to implement compared to the three func i = img.frames.index((frame, frame_info)) pilframe = Image.open(io.BytesIO(frame.to_bytes())).convert("RGBA") - #print str(i)+"\t"+disposes[dispose_op]+"\t\t"+blends[frame_info.blend_op] - if dispose_op == APNG_DISPOSE_OP_BACKGROUND or (i == 0 and dispose_op == APNG_DISPOSE_OP_PREVIOUS): prev_frame = outputbuf.copy() emptyrect = Image.new("RGBA", (img.frames[i-1][0].width, img.frames[i-1][0].height), (255,255,255,0)) @@ -55,14 +53,18 @@ def load_apng(file): # this one was hell to implement compared to the three func final_frame = outputbuf.copy() pilframes.append(final_frame) if frame_info: - frames.append([final_frame.toqimage(), frame_info.delay*10]) # convert delay from centiseconds to milliseconds + # convert delay from centiseconds to milliseconds + if frame_info.delay_den == 100: + delay = frame_info.delay * 10 + else: + delay = frame_info.delay * (1000.0 / frame_info.delay_den) + frames.append([final_frame.toqimage(), delay]) dispose_op = frame_info.depose_op else: frames.append([final_frame.toqimage(), 0]) for frame in pilframes: frame.close() return frames - #return pilframes def load_webp(file): img = Image.open(file)