使用rmagick和Sinatra生成动画旋转图像并在内存版本中显示

时间:2015-10-30 16:11:12

标签: ruby sinatra rmagick

我正在使用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而不需要先将它保存到磁盘上?

1 个答案:

答案 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
相关问题