PIL保存动画WebP异常:生成静态文件而非动画文件
问题原因及修复方案
问题出在动画帧保存的参数逻辑上:
frames[0].save( f'{config.media_source}avatars/{attachment_name}', format='webp', save_all=True, append_images=frames[:1], # 此处为错误核心 loop=0, )
frames[:1]仅提取列表的第一个元素,和当前保存的frames[0]是同一帧,相当于没有追加任何后续动画帧,最终生成的WebP自然是静态图。
修复后的代码
将append_images=frames[:1]改为append_images=frames[1:],这样才能把第一帧之外的所有动画帧追加进去:
frames[0].save( f'{config.media_source}avatars/{attachment_name}', format='webp', save_all=True, append_images=frames[1:], loop=0, duration=img.info.get('duration', 100) # 可选:保留原动画的帧间隔,避免播放速度异常 )
额外建议添加duration参数,从原图片信息中读取帧间隔,否则默认播放速度可能和原动画不一致。
补充检查点
- 确认
is_animated_image函数能准确识别动画图片 - 若涉及
resize_avatar函数,需保证它对动画图片的处理逻辑正确(比如逐帧缩放后重新组合动画帧)
内容的提问来源于stack exchange,提问作者kipteam
相关产品推荐
相关产品推荐

