ruby 如何用libvips叠加动画图像?

nxowjjhe  于 2022-12-18  发布在  Ruby
关注(0)|答案(2)|浏览(96)

我有两个动图:aura.gif是一个7帧的动画,character.gif是一个1帧的图像。当我把一个叠加在另一个上面时,我得到了一个7帧的动画图像,但是character.gif中的角色只出现在第一帧。
我怎样才能将角色复制7次,这样当我将它覆盖在光环上时,角色会在所有7帧中显示出来?
我无法从一开始就制作character.gif动画。

require 'vips'

character = File.open("character_no_animation.gif").read
character_b = Vips::Image.new_from_buffer(character, "", access: 'sequential', n: -1)

aura = File.open("aura.gif").read
aura_b = Vips::Image.new_from_buffer(aura, "", access: 'sequential', n: -1)

aura_b.composite(character_b, "over", x: 0, y: 0).gifsave("composite.gif")
rqmkfv5c

rqmkfv5c1#

交叉发布于此:
https://github.com/libvips/ruby-vips/discussions/353
这表明:

require 'vips'

character = Vips::Image.new_from_file(ARGV[0])
aura = Vips::Image.new_from_file(ARGV[1], access: 'sequential')

character = character
    .replicate(1, aura.get("n-pages"))
aura
    .composite(character, "over")
    .write_to_file(ARGV[2])

这应该会更快,因为它只是一个复合操作,而不是7个在彼此之上。

cbjzeqam

cbjzeqam2#

我意识到Vips中的动画图像是作为height * num_frames中的图像加载的,所以我最终得到了以下代码,它可以完成我所需要的任务:

require 'vips'

character = File.open("character.gif").read
character_b = Vips::Image.new_from_buffer(character, "")

aura = File.open("aura.gif").read
aura_b = Vips::Image.new_from_buffer(aura, "", access: 'sequential', n: -1)

page_h = aura_b.get("height") / aura_b.get("n-pages")
aura_b.get("n-pages").times.each do |i|
  aura_b = aura_b.composite(character_b, "over", x: 0, y: page_h * i)
end

aura_b.gifsave("composite.gif")

相关问题