【问题标题】:Having trouble getting multiple carrierwave processes to run无法让多个载波进程运行
【发布时间】:2013-08-20 17:14:33
【问题描述】:

我正在尝试在使用 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

【问题讨论】:

  • 你的意思是优化调整大小的图像
  • 是的,我希望将版本转换为 jpg,隔行扫描并调整到指定的尺寸。
  • 我收到错误:NameError (undefined local variable or method img 你在哪里定义img?
  • 要操作的块得到一个变量。上面的示例已更新。

标签: carrierwave minimagick


【解决方案1】:

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

解决方案 1)

如果您摆脱了carrierwave helper,那么它也许可以工作 做这样的事情

   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 helper(因为它们是通过注册/调用的process 方法,不能在进程内调用调用/调用进程)

这样的事情你做不到

  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 选项,它会将原始图像(上传的图像)视为源文件(父文件)创建所需的版本

【讨论】:

  • 这很有趣。我设置的多个进程被调用,图像本身没有被改变。我还在互联网上看到了这种格式的提及,这是我选择它的地方。我需要尝试一下,因为单个进程应该比运行多个进程更快并且使用更少的资源。
  • 好吧,我仍然无法让转换工作,但是将所有操作滚动到我自己的自定义流程中似乎正在工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 2022-07-23
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 2016-05-06
相关资源
最近更新 更多