如何使用libvips实现单帧图与多帧动图叠加并全帧显示?
解决单帧GIF与多帧GIF叠加后仅第一帧显示角色的问题
问题描述
现有两个GIF文件:7帧动画的aura.gif和单帧的character.gif。使用Vips的Ruby代码叠加二者后,生成的动画仅第一帧显示角色,需要让角色在所有7帧中都显示,且不能预先将单帧角色图转为动画文件。
原代码问题分析
原代码中,单帧的character_b与多帧的aura_b执行composite时,Vips只会将单帧与动画的第一帧合并,后续帧没有叠加角色层,导致只有第一帧显示角色。
解决方案
在内存中将单帧角色图复制为与光环动画帧数一致的多帧图像,再与光环动画叠加,即可让角色出现在所有帧中。
修改后的代码
require 'vips' # 读取单帧角色图像 character_data = File.open("character_no_animation.gif").read character_frame = Vips::Image.new_from_buffer(character_data, "", access: 'sequential') # 读取7帧光环动画 aura_data = File.open("aura.gif").read aura_animation = Vips::Image.new_from_buffer(aura_data, "", access: 'sequential', n: -1) # 获取光环动画的总帧数 frame_count = aura_animation.get("n-pages") # 将单帧扩展为对应帧数的多帧图像 character_animation = character_frame.copy(n: frame_count) # 叠加动画并保存结果 aura_animation.composite(character_animation, "over", x: 0, y: 0).gifsave("composite.gif")
关键步骤说明
aura_animation.get("n-pages"):获取光环动画的总帧数(此处为7帧)character_frame.copy(n: frame_count):将单帧角色图复制为7帧的动画,每帧内容完全相同- 两个多帧动画叠加后,每帧都会包含角色层,最终生成的动画所有帧均显示角色
内容的提问来源于stack exchange,提问作者Juan Alonso
相关产品推荐
相关产品推荐

