无法运行多个载波进程

时间:2013-08-20 17:14:33

标签: carrierwave minimagick

我正在尝试使用Carrierwave调整图像大小时优化图像但是没有任何运气可以让它工作。 Carrierwave正在生成不同大小的版本,但我的自定义优化和转换过程未运行。我试过在不同的地方调用不同的进程,但似乎没有任何工作。

关于我可能做错的任何想法?这可能是同一个问题:CarrierWave RMagick - How do I cause manipulate! to be called?

class FooUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  # Attempt #1
  process :convert => 'jpg'
  process :optimize
  version :meow do
    process :resize_to_fill => [700, 400]
  end


  # Attempt #2
  version :meow do
     process :convert => 'jpg', :optimize => nil, :resize_to_fill => [700, 400]
  end

  # Attempt #3
  version :meow do
    process :resize_to_limit => [700, 400]
    process :optimize
    process :convert => 'jpg'
  end

  # Attempt #4
  # Tried switching order around since they are being resized but not converted
  version :meow do
    process :convert => 'jpg'
    process :optimize
    process :resize_to_limit => [700, 400]
  end

  # Optimize method used by all versions
  def optimize
    manipulate! do |img|
      img.strip
      img.combine_options do |c|
        c.quality "96"
        c.depth "24"
        c.interlace "plane"
        #c.interlace "Plane" # Tried both cases, seen examples of both
      end
      img
     end
  end

end

1 个答案:

答案 0 :(得分:2)

如果你使用的是carrierwave mini-magick或rmagick helper方法,那么你想要的方式完全不可能

解决方案1)

如果你摆脱了载波波助手那么也许它可以工作    做这样的事

   process :custom_processing 

   def custom_processing 
     // You have to write you own code for and not CarrierWave helper method to achieve this 
     // write your own code to convert to jpg 
     // write your code to optimize
     // write your code to resize from the converted n optimize image
   end

通过这种方式你可以一次性完成所有处理,但是你必须深入了解mini_magick/rmagick文档以了解如何调用每个方法,因为你不能依赖于carrierwave助手(因为它们已经注册/通过process方法调用,并且不能在进程内调用call / invoke进程)

所以这样的事情你无法实现

  def custom_processing
    process :convert => 'jpg'
    process :optimize
    process :resize_to_fit  => [700, 400]
  end

解决方案2)

使用Carrierwave Helper但通过多个版本,您最终可以实现此目标

  version :jpg do
     process :convert => 'jpg'
  end 

  version :optimize_jpg ,:from => :jpg do 
    process :optimize
  end 

  version :meow,:from => :optimize_jpg do
    process :resize_to_limit => [700, 400]
  end

可以找到更多参考资料here

现在这种方法解决了方法1挖掘文档的麻烦(因为我们正在使用Carrierwave辅助方法),但正如您所看到的,您必须创建多个版本才能实现此目的

问题:为什么有多个版本?

好吧Carrierwave是如何工作的,它为每个版本创建一个上传器,如果from选项没有应用,它会将原始图像(上传图像)视为源文件(父文件)创建所需版本