Carrierwave RMagick没有删除转换为jpg的透明度

我正在尝试上传PNG并保存一堆缩略图。 缩略图都应该是JPG,没有任何透明度。 不知何故,文件保存为jpg但它具有透明度……

这是我的上传者:

# encoding: utf-8 class WinePhotoUploader  '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 

哦……显然,载波似乎不想记录任何东西,所以我不知道它在做什么。

在转换文件类型时,似乎有一个带有imagemagick和操作顺序的怪癖。

完整的github问题可以在这里找到: https : //github.com/carrierwaveuploader/carrierwave/issues/133#issuecomment-615254

对于您拥有的每个process基本上都会调用一次manipulatemanipulate打开当前文件路径,进行更改然后写入。 因此,似乎在格式转换后调用的任何生成线都在原始文件上执行,而不是在新转换的文件上执行。

为了解决这个问题,您必须在单个manipulate块中执行所有process操作,或确保转换是最后一个要运行的process

github问题的例子是:

 process :convert_and_scale def convert_and_scale manipulate! do |img| img.format 'png' img.resize '100x32' img end end