carrierwave - 无法运行多个载波进程

标签 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

最佳答案

如果您使用 Carrierwave mini-magick 或 rmagick 辅​​助方法,那么它们并不完全可能按照您想要的方式实现

解决方案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 文档以了解如何为每个方法调用什么方法,因为您不能依赖载波助手(因为它们是通过 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 选项,它会将原始图像(上传的图像)视为源文件(父文件),创建所需的版本

关于carrierwave - 无法运行多个载波进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18341127/

相关文章:

ruby-on-rails - Minimagick 错误 : ImageMagick/GraphicsMagick is not installed

ruby-on-rails - 载波。无法使用 STI 保存文件

ruby-on-rails - Carrierwave Rails with Edit Form and file_field (No file selected)

ruby-on-rails - 如何用MiniMagick上传图片时使图片圆角

ruby - mini_magick gem 不适用于我的 ImageMagick 安装

ruby-on-rails - 用带有 Paperclip 的 mini_magick 替换 RMagick

ruby-on-rails - 在所有载波上传的图像上未找到生产中的载波 404

ruby-on-rails - Rails4 : How do I display and edit uploaded file using carrierwave?

ruby-on-rails-3 - Rails 3.2 Assets 管道、CarrierWave 和 .gitignore

ruby-on-rails - 如何在 Rails 应用程序中使用 mini_magick 获取 EXIF 关键字?