ruby-on-rails – Carrierwave的问题:转换

我希望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.png. jpg.jpg确实总是一个JPEG文件(用Unix的文件命令验证),但是png png.png只是一个真正的PNG格式文件,当且仅当我最初传入一个png格式的文件时(传入一个jpeg导致一个jpeg格式文件)!

想法?

这可能没什么用,但我发现Carrierwave中的convert方法本身是可疑的:convert(some_format)调用操作!(:format => some_format),后者又调用(some_image_object).write(“#{some_format}:# {}的current_path“).现在,如果传入的原始图像是bla.format(格式= jpg,png等),则current_path的扩展名为.format(通过操作上的monkey-patch进行测试!).在RMagick中图像格式转换的工作方式是使用具有所需扩展名的参数调用write.那么为什么上面的jpeg转换实际发生呢?如果是这样,为什么png转换会失败?

此外,如果它有用,我在Rails 3.0.9和Carrierwave 0.5.6上

谢谢!

解决方法

所以我不确定为什么会这样,但事实证明问题出现在我隐藏的png版本的#more处理器部分.从版本中省略它们会导致任何输入类型的正版PNG文件.这些处理器调用操作!并做一些事情.相反,修复是调用操作!(:format =>’png’).好极了.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...