1

Я пытаюсь загрузить PNG и сохранить кучу миниатюр. Миниатюры должны быть JPG и не иметь прозрачности. Каким-то файл сохраняется в формате JPG, но она имеет прозрачность ...Carrierwave RMagick не снимает прозрачность в конвертировании в jpg

Вот мой Uploader:

# 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 альфа при вызове: 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

Спасибо, что сделал! Пока вы здесь, знаете ли вы, что у eff есть плюс варианты, такие как «+ repage»? Я пробовал, что было предложено для minimagick ... img.push '+ repage' ... img. + ... img.repage ... но я получаю неопределенный метод 'gsub 'для nil: NilClass. Это похоже на ОЧЕНЬ последнее, что мне нужно. – JakeTheSnake

+0

Я не уверен, извините. Попробуйте задать новый вопрос, если вы не можете найти решение в любом месте. – Roganartu

+0

Вопрос для всех, кого это интересует: http://stackoverflow.com/questions/19626679/carrierwave-repage-option-not-working – JakeTheSnake

Смежные вопросы