1

我正在尝试上传 PNG 并保存一堆缩略图。缩略图应全部为 JPG 且不具有任何透明度。不知何故,文件保存为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 似乎不想记录任何东西,所以我不知道它在做什么。

4

1 回答 1

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
于 2013-10-28T02:48:10.310 回答