Rails + Carrierwave + RMagick:GIF转换为JPG但不保存正确的文件扩展名

时间:2013-11-09 12:07:51

标签: ruby-on-rails carrierwave rmagick

我目前正在尝试获取gif文件的第一帧,调整其大小并将其另存为jpg文件。

我认为转换似乎很好。但它没有使用正确的文件扩展名保存它。它仍然保存为.gif 因此,当我尝试打开它时,它说无法打开图像,似乎不是一个GIF文件。然后我自己重命名扩展程序并且它可以工作。

这是我的处理代码:

version :gif_preview, :if => :is_gif? do
  process :remove_animation
  process :resize_to_fill => [555, 2000]
  process :convert => 'jpg'
end

def remove_animation
  manipulate! do |img, index|
    index == 0 ? img : nil
  end
end

2 个答案:

答案 0 :(得分:3)

实际上还有另一种更清洁的方法;它甚至在官方维基中有所记载:How To: Move version name to end of filename, instead of front

使用此方法,您的版本代码如下所示:

version :gif_preview, :if => :is_gif? do
  process :remove_animation
  process :resize_to_fill => [555, 2000]
  process :convert => 'jpg'

  def full_filename(for_file)
    super.chomp(File.extname(super)) + '.jpg'
  end
end

def remove_animation
  manipulate! do |img, index|
    index == 0 ? img : nil
  end
end    

答案 1 :(得分:1)

所以...我终于找到了一个解决方案,经过数小时的头痛,为什么这不起作用。事实证明,您必须先触摸/创建一个文件才能使其正常工作。我也从RMagick切换到Mini Magick。不是出于某种特殊原因,只是尝试了它,如果它可以与MiniMagick一起工作,但我仍然有同样的问题。这是我使用Mini Magick的新流程代码:

version :gif_preview, :if => :is_gif? do
  process :gif_to_jpg_convert
end

def gif_to_jpg_convert
  image = MiniMagick::Image.open(current_path)
  image.collapse! #get first gif frame
  image.format "jpg"
  File.write("public/#{store_dir}/gif_preview.jpg", "") #"touch" file
  image.write "public/#{store_dir}/gif_preview.jpg"
end

我只是不明白为什么真的有关于此的0文件......