1

我想上傳一個PNG並保存一堆縮略圖。縮略圖應該都是JPG格式,並且沒有任何透明度。不知不覺中,這些文件被保存爲JPG格式,但它具有透明度......Carrierwave RMagick不會刪除轉換爲JPG的透明度

這是我上傳:

# encoding: utf-8 

class WinePhotoUploader < CarrierWave::Uploader::Base 

    # Include RMagick or MiniMagick support: 
    include CarrierWave::RMagick 
    # include CarrierWave::MiniMagick 

    # Choose what kind of storage to use for this uploader: 
    storage :file 
    # storage :fog 

    # Override the directory where uploaded files will be stored. 
    # This is a sensible default for uploaders that are meant to be mounted: 
    def store_dir 
    "assets/wines/#{version_name}" 
    end 

    CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/ 

    # Provide a default URL as a default if there hasn't been a file uploaded: 
    def default_url 
    # For Rails 3.1+ asset pipeline compatibility: 
    ActionController::Base.helpers.asset_path("pages/wines/#{version_name}/default.png") 
    end 

    process :for_all 
    process :convert => 'jpg' 

    version :croppable, :if => :new_upload? do 
    process :resize_and_pad => [1200, 1200, 'white'] 
    end 

    version :show, :if => :new_upload? do 
    process :resize_to_fit => [nil, '425'] 
    end 

    version :general, :from_version => :show, :if => :new_upload? do 
    process :resize_and_pad => [150, 375, 'white'] 
    end 

    version :thumb, :from_version => :croppable, :if => :cropping? do 
    process :rotate_to => [-30] 
    process :crop_via_model 
    process :resize_to_fit => [150, 150] 
    end 

    def for_all 
    manipulate! do |img| 
     img.trim 
     img.gravity = Magick::CenterGravity 

     # I only use these two because this shit isn't working...these don't seem to help! 
     # Neither does the flatten method...even though other posts on stackoverflow.com say 
     # that it works. 
     img.background_color = 'white' 
     img.alpha Magick::OpaqueAlphaChannel 

     img.unsharp_mask 0.3, 0.3, 5, 0 
     img 
    end 
    end 

    def extend_to(w, h) 
    manipulate! do |img| 
     img.gravity = Magick::CenterGravity 
     img.extent w, h 
     img 
    end 
    end 

    def rotate_to(deg) 
    manipulate! do |img| 
     img.gravity = Magick::CenterGravity 
     img.distort Magick::ScaleRotateTranslateDistortion, deg 
     #img.repage # WTF?!?!?!? No repage method?! 
     img 
    end 
    end 

    def crop_via_model 
    manipulate! do |img| 
     img.gravity = Magick::CenterGravity 
     img.crop model.crop_x.to_i, model.crop_y.to_i, model.crop_w.to_i, model.crop_h.to_i 
     img 
    end 
    end 

    def flatten 
    manipulate! do |img| 
     img_list = Magick::ImageList.new 
     img_list.from_blob img.to_blob 
     img_list.new_image(img_list.first.columns, img_list.first.rows) { self.background_color = "white" } # Create new "layer" with white background and size of original image 
     img = img_list.reverse.flatten_images 
     img 
    end 
    end 

    def new_upload? picture 
    !model.cropping? 
    end 
    def cropping? picture 
    model.cropping? 
    end 

    # Add a white list of extensions which are allowed to be uploaded. 
    # For images you might use something like this: 
    def extension_white_list 
    %w(jpg jpeg gif png tif) 
    end 

    # Override the filename of the uploaded files: 
    # Avoid using model.id or version_name here, see uploader/store.rb for details. 
    def filename 
    "#{ model.get_permalink(:normalized => true) }.jpg" 
    end 

    # Remove this when https://github.com/carrierwaveuploader/carrierwave/issues/1164 is solved. 
    def recreate_versions!(*versions) 
    if versions.any? 
     from_versions = versions.group_by { |v| self.class.versions[v][:options][:from_version] } 
     from_versions.each do |from, versions| 
     next if from.nil? 
     file = CarrierWave::SanitizedFile.new(self.versions[from.to_sym].file) 
     store_versions!(file, versions) 
     end 
    else 
     super(*versions) 
    end 
    end 

end 

哦......顯然carrierwave似乎並不想記錄什麼,所以我不能告訴它在做什麼。

+0

JPG不支持透明度,使新的文件不符合透明度JPG它的(可能)一個PNG保存爲'.jpg'擴展。 – Roganartu

+0

所以它不會轉換rgb alpha值在調用:convert?使用過程有什麼意義:convert =>'jpg',爲什麼img.background_color ='white'或img.alpha Magick :: OpaqueAlphaChannel可以工作? – JakeTheSnake

回答

1

轉換文件類型時,似乎有一個與imagemagick和操作順序的怪癖。

全部GitHub上的問題可以在這裏找到:https://github.com/carrierwaveuploader/carrierwave/issues/133#issuecomment-615254

基本上manipulate爲每個process你必須調用一次。 manipulate打開當前文件路徑,然後進行更改寫入。正因爲如此,看起來格式轉換後調用的任何process行都是在原始文件上執行的,而不是新轉換後的行。

爲了解決這個問題,你要麼必須做所有的process操作的單一manipulate塊內或確保轉換是最後process運行。

這從GitHub的問題的例子是:

process :convert_and_scale 

def convert_and_scale 
    manipulate! do |img| 
    img.format 'png' 
    img.resize '100x32' 
    img 
    end 
end 
+0

謝謝,這樣做!當你在這裏時,你是否知道「+ repage」加上選項會帶來什麼效果?我嘗試了minimagick的建議... img.push'+ repage'... img。+ ... img.repage ...但是我得到了nil:NilClass的未定義方法'gsub'。這就像我需要的最後一件事情。 – JakeTheSnake

+0

我不確定,對不起。嘗試問一個新的問題,如果你無法在任何地方找到解決方案。 – Roganartu

+0

問題在這裏任何感興趣的人:http://stackoverflow.com/questions/19626679/carrierwave-repage-option-not-working – JakeTheSnake