【问题标题】:Trouble with Carrierwave :convert载波问题:转换
【发布时间】:2011-11-04 21:34:06
【问题描述】:

我希望 Carrierwave 生成几个版本的图像,一个是 png 格式,一个是 jpeg 格式,但我似乎无法让它工作。我意识到这里和其他地方都提出了几个类似的问题,但我未能找到解决方案。大致来说,这就是我所拥有的:

class MyUploader < CarrierWave::Uploader::Base
  include CarrierWave::RMagick

  version :jpeg do 
    process :convert => 'jpg'
    # more procesors
    process :processed => :jpg
  end

  version :png do
    process :convert => 'png'
    # more processors 
    process :processed => :png
  end

  def store_path(for_file = filename)
    if version_name != :png
      return "#{version_name}.jpg"
    else
      return "#{version_name}.png"
    end
  end

  def filename
    filename = if version_name != :png
      super != nil ? super.split('.').first + '.jpg' : super
    else 
      super != nil ? super.split('.').first + '.png' : super
    end
  end

end

因此,无论我传入哪种图像格式,这都会生成两个文件:一个名为jpg.jpg,另一个名为png.pngjpg.jpg 确实始终是 JPEG 文件(已通过 Unix 的 file 命令验证),但 png.png 仅当且仅当我最初传入 png 格式的文件(传入 jpeg 结果时)才是真正的 PNG 格式文件在 jpeg 格式的文件中)!

想法?

这可能没用,但我发现Carrierwave 中的convert 方法本身很可疑:convert(some_format) 调用manipulate!(:format =&gt; some_format),而后者又调用(some_image_object).write("#{some_format}:#{current_path}")。现在,如果传入的原始图像是 bla.format(格式 = jpg、png 等),current_path 的扩展名为 .format(通过 manipulate! 上的猴子补丁测试)。图像格式转换在RMagick 中的工作方式是通过调用write 并使用具有所需扩展名的参数。那么为什么上面的 jpeg 转换实际上会发生呢?如果是这样,为什么 png 转换会失败?

另外,如果有用的话,我在 Rails 3.0.9 和 Carrierwave 0.5.6 上

谢谢!

【问题讨论】:

    标签: ruby-on-rails carrierwave file-upload


    【解决方案1】:

    所以我不确定为什么会出现这种情况,但事实证明问题出在我上面隐藏的 png 版本的 # more processors 部分。从版本中省略它们会导致任何输入类型的真正 PNG 文件。这些处理器调用manipulate! 并做一些事情。解决方法是改为调用manipulate!(:format =&gt; 'png')。耶。

    【讨论】:

    猜你喜欢
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2013-07-05
    相关资源
    最近更新 更多