我正在使用Sinatra在Ruby中编写一个简单的Web应用程序来获取上传的图像,生成三个额外的旋转版本,然后将它们添加到Magick::ImageList
以生成原始图像的动画旋转版本。我正在使用rmagick库来执行此操作。这是sinatra路线代码 - 我生成一个图像,然后将其传递给HAML模板:
post '/spin' do
# The image being uploaded is a PNG
img = Magick::Image.read(params['spinthis'][:tempfile].path)[0]
spinned_image = MyRandomClassThatHandlesSpinning.spin(img)
@result = Base64.encode64(spinned_image.to_blob)
haml :result
end
MyRandomClassThatHandlesSpinning.spin(img)
定义如下:
def self.spin(img)
spinny_image = Magick::ImageList.new { |img| img.format = "GIF" }
spinny_image << img
spinny_image << img.rotate(90)
spinny_image << img.rotate(180)
spinny_image << img.rotate(270)
spinny_image.delay = 1
spinny_image.ticks_per_second = 5
spinny_image.iterations = 0
spinny_image
end
这是HAML模板:
!!!
%head
%title GIF
%h1 GIF below!
%img(src="data:image/gif;base64,#{@result}")
由于某种原因,显示的图像不是动画,而只是初始图像。
但是,如果在我的self.spin
函数中,我将spinny_image
写入文件,当我在Chrome(或其他图像编辑器)中加载该文件时,它会显示所有旋转的帧。< / p>
有没有办法生成这个GIF而不需要先将它保存到磁盘上?
答案 0 :(得分:0)
我找到了一个解决方案 - 不确定它是否最佳,但它有效。我希望那里的人有比我更好的答案:)
我强迫img
我传入self.spin
成为一个gif,这使得图像动画化了。这是我的self.spin
方法现在的样子:
def self.spin(img)
spinny_image = Magick::ImageList.new
img.format = "gif"
spinny_image << img
spinny_image << img.rotate(90)
spinny_image << img.rotate(180)
spinny_image << img.rotate(270)
spinny_image
end