我如何使用 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,这应该只是一行,我很确定剩下的就是这些了。
更简单,不是吗?
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,这应该只是一行,我很确定剩下的就是这些了。
更简单,不是吗?