如何在 python 中将 .webp 转换为 .apng?
How to convert .webp to .apng in python?
我正在尝试将 .webp 中的动画图像转换为 .apng;我尝试了以下方法:
from PIL import Image, ImageSequence
from apng import APNG
im = Image.open('/content/animate_w.webp')
#im.save('/content/animate_w.apng', 'apng', save_all = True, optimize = True, background=0) # not work
im.save('/content/animate_w.png', 'png', save_all = True, optimize = True, background=0)
im = Image.open('/content/animate_w.png')
i = 0
for frame in ImageSequence.Iterator(im):
ex_command = f'frame_{i} = frame'
exec(ex_command)
i += 1
# not really sure what's next
files = [
("frame_1.png", 100),
("frame_2.png", 200),
("frame_3.png", 300)
]
im = APNG()
for file, delay in files:
im.append_file(file, delay=delay)
im.save("result.apng")
单独保存框架部分不起作用,我不确定下一步如何进行。有什么想法吗?
你的方向是正确的,你只需要添加从webp文件中提取帧的步骤。
希望下面的代码能增加更多实现思路
我正在使用 webptools 提取帧
from webptools import webpmux_getframe
from PIL import Image, ImageSequence
from apng import APNG
# Load the webp file
# Downloaded from https://pullzone1-corydowdywebdesi.netdna-ssl.com/assets/blog/apngwebp/squirrel.q70.m6.mixed.webp
im = Image.open('squirrel.q70.m6.mixed.webp')
# Get the number of frames
num_of_frame = 0
for frame in ImageSequence.Iterator(im):
ex_command = f'frame_{num_of_frame} = frame'
exec(ex_command)
num_of_frame += 1
# Extract the frames
list_of_files = []
for i in range(num_of_frame):
webpmux_getframe(input_image='squirrel.q70.m6.mixed.webp', output_image=f'output_frame{i}.png', frame_number=i)
list_of_files.append(f'output_frame{i}.png')
# Save to APNG
im = APNG()
for filename in list_of_files:
im.append_file(filename)
im.save('result.apng')
# Load frame from APNG file
im = APNG.open('result.apng')
for i, (png, control) in enumerate(im.frames):
png.save(f'apng_frame_{i}.png')
另一种不使用 webptools 的解决方案是使用 PIL 的 WebPimageFile
from PIL import WebPImagePlugin
from apng import APNG
# Load webp and extract the frames
imwebp = WebPImagePlugin.WebPImageFile('squirrel.q70.m6.mixed.webp')
nframes = 0
list_of_files = []
while imwebp:
imwebp.seek(nframes)
imwebp.save(f'output_frame{nframes}.png', 'PNG')
list_of_files.append(f'output_frame{nframes}.png')
nframes += 1
try:
imwebp.seek(nframes)
except EOFError:
break
# Save to APNG
im = APNG()
for filename in list_of_files:
im.append_file(filename)
im.save('result.apng')
# Load frame from APNG file
im = APNG.open('result.apng')
for i, (png, control) in enumerate(im.frames):
png.save(f'apng_frame_{i}.png')
我正在尝试将 .webp 中的动画图像转换为 .apng;我尝试了以下方法:
from PIL import Image, ImageSequence
from apng import APNG
im = Image.open('/content/animate_w.webp')
#im.save('/content/animate_w.apng', 'apng', save_all = True, optimize = True, background=0) # not work
im.save('/content/animate_w.png', 'png', save_all = True, optimize = True, background=0)
im = Image.open('/content/animate_w.png')
i = 0
for frame in ImageSequence.Iterator(im):
ex_command = f'frame_{i} = frame'
exec(ex_command)
i += 1
# not really sure what's next
files = [
("frame_1.png", 100),
("frame_2.png", 200),
("frame_3.png", 300)
]
im = APNG()
for file, delay in files:
im.append_file(file, delay=delay)
im.save("result.apng")
单独保存框架部分不起作用,我不确定下一步如何进行。有什么想法吗?
你的方向是正确的,你只需要添加从webp文件中提取帧的步骤。
希望下面的代码能增加更多实现思路
我正在使用 webptools 提取帧
from webptools import webpmux_getframe
from PIL import Image, ImageSequence
from apng import APNG
# Load the webp file
# Downloaded from https://pullzone1-corydowdywebdesi.netdna-ssl.com/assets/blog/apngwebp/squirrel.q70.m6.mixed.webp
im = Image.open('squirrel.q70.m6.mixed.webp')
# Get the number of frames
num_of_frame = 0
for frame in ImageSequence.Iterator(im):
ex_command = f'frame_{num_of_frame} = frame'
exec(ex_command)
num_of_frame += 1
# Extract the frames
list_of_files = []
for i in range(num_of_frame):
webpmux_getframe(input_image='squirrel.q70.m6.mixed.webp', output_image=f'output_frame{i}.png', frame_number=i)
list_of_files.append(f'output_frame{i}.png')
# Save to APNG
im = APNG()
for filename in list_of_files:
im.append_file(filename)
im.save('result.apng')
# Load frame from APNG file
im = APNG.open('result.apng')
for i, (png, control) in enumerate(im.frames):
png.save(f'apng_frame_{i}.png')
另一种不使用 webptools 的解决方案是使用 PIL 的 WebPimageFile
from PIL import WebPImagePlugin
from apng import APNG
# Load webp and extract the frames
imwebp = WebPImagePlugin.WebPImageFile('squirrel.q70.m6.mixed.webp')
nframes = 0
list_of_files = []
while imwebp:
imwebp.seek(nframes)
imwebp.save(f'output_frame{nframes}.png', 'PNG')
list_of_files.append(f'output_frame{nframes}.png')
nframes += 1
try:
imwebp.seek(nframes)
except EOFError:
break
# Save to APNG
im = APNG()
for filename in list_of_files:
im.append_file(filename)
im.save('result.apng')
# Load frame from APNG file
im = APNG.open('result.apng')
for i, (png, control) in enumerate(im.frames):
png.save(f'apng_frame_{i}.png')