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
答案 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')
更重要的是,结果:
您会注意到composite!
的使用,它会替换现有的帧(仍在giflist
变量中)。
你要做的最后一部分是将头像的大小减少到40x40,这应该只是一行,而且我很确定这就是剩下的一切。
更简单,不是吗?