我如何使用 rmagick 将图像粘贴到 ruby 中的 gif 中的每一帧

How do i paste an image onto every frame in a gif in ruby with rmagick

require 'rmagick'
require 'open-uri'
include Magick

giflist = Magick::ImageList.new('pewpewpew.gif')
open('avatar.jpg', 'wb') do |file|
  file << open('https://cdn.discordapp.com/avatars/120571255635181568/8e37daf54a9c631afe659ebcb87af959.jpg').read
end

avatar = Magick::Image.read('avatar.jpg').first

newavatar = Draw.new {
  self.fill = 'black'
  self.stroke = 'transparent'
  self.tile = avatar
  self.fill_pattern = avatar
  self.stroke_pattern = avatar
  self.gravity = NorthGravity
}
giflist.each { |image| newavatar.composite(20, 20, 40, 40, image) }# x, y, width, height, image
giflist.write('newgif.gif')

所以基本上我是想将这个 jpg 粘贴到 gif 上,但由于某种原因没有发生任何事情,我也没有收到任何错误。图片已正确下载,所以我知道这不是问题

gif -> Gif Link

老实说,我不知道为什么这不是写的错误。我可以告诉你 Ruby' 为什么事情不起作用的主义,但我越是尝试解释这种行为,我越是无法证明它。

无论如何,这是我认为我知道的:

newavatar.composite(20, 20, 40, 40, image)

这是在 头像上绘制 gif 。但是你不能只交换变量。 "no cur_image defined".

爆炸了
giflist.each { |image| newavatar.composite(20, 20, 40, 40, image) }

要么每个帧都返回到 newavatar,要么由于没有分配发生而被丢弃 (image = giflist.each { … })。但是同样,无论我尝试以何种方式将其组合在一起,我都会遇到各种错误。

这是我想出的解决方案:

require 'rmagick'
require 'open-uri'
include Magick

giflist = Magick::ImageList.new('pewpewpew.gif')
open('avatar.jpg', 'wb') do |file|
  file << open('https://cdn.discordapp.com/avatars/120571255635181568/8e37daf54a9c631afe659ebcb87af959.jpg').read
end

avatar = Magick::Image.read('avatar.jpg').first

giflist.each { |image| image.composite!(avatar, NorthWestGravity, 40, 40, OverCompositeOp) }
giflist.write('newgif.gif')

更重要的是,结果:

您会注意到 composite! 的使用,它替换了原位的框架(仍在 giflist 变量中)。

你要做的最后一部分是将头像的大小减小到 40x40,这应该只是一行,我很确定剩下的就是这些了。

更简单,不是吗?