2011-11-03 76 views
5

我想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格式化文件,当且仅当我最初传入一个png格式文件时(传递JPEG格式文件中的jpeg结果) !

想法?

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

而且,如果它是有用的,我on Rails的3.0.9和Carrierwave 0.5.6

谢谢!

回答

5

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

+0

谢谢,你救了我的夜 –

+1

任何人在看这个答案可以阅读此:http://stackoverflow.com/questions/19625066/carrierwave-rmagick-not-removing-transparency-in-convert-to-jpg – JakeTheSnake