2011-11-03 75 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