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

时间:2016-12-06 22:06:32

标签: ruby image imagemagick gif

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 - &gt; Gif Link

1 个答案:

答案 0 :(得分:1)

我将完全诚实,我不知道为什么这不是写错误。我可以告诉你关于为什么事情不起作用的Ruby主义,但是我尝试和解释行为越多,我就越难以证明它。

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

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

这是在头像上绘制gif 。但你不能只交换变量。爆发了“没有cur_image定义”。

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')

更重要的是,结果:

Avatar overlaid on gif

您会注意到composite!的使用,它会替换现有的帧(仍在giflist变量中)。

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

更简单,不是吗?