You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:05:32