1

Client.rb

  has_attached_file :avatar,
  :path => ":rails_root/public/system/:attachment/:id/:style/:filename",
  :url => "/system/:attachment/:id/:style/:filename",
  :styles => {:thumb => "144x144#", :grayscale => { :processors => [:grayscale] }}

親指バージョンのバージョンはうまく機能し、画像は必要なサイズにトリミングされ、グレースケールはその画像をグレースケールに変換するだけですが、画像はトリミングされていません.StackOverflowで見つけたグレースケールジェネレーターは次のとおりです。

lib/グレースケール.rb

module Paperclip
  # Handles grayscale conversion of images that are uploaded.
  class Grayscale < Processor

    def initialize file, options = {}, attachment = nil
      super
      @format = File.extname(@file.path)
      @basename = File.basename(@file.path, @format)
    end

     def make
       src = @file
       dst = Tempfile.new([@basename, @format])
       dst.binmode

       begin
         parameters = []
         parameters << ":source"
         parameters << "-colorspace Gray"
         parameters << ":dest"

         parameters = parameters.flatten.compact.join(" ").strip.squeeze(" ")

         success = Paperclip.run("convert", parameters, :source => "#{File.expand_path(src.path)}[0]", :dest => File.expand_path(dst.path))
       rescue PaperclipCommandLineError => e
         raise PaperclipError, "There was an error during the grayscale conversion for #{@basename}" if @whiny
       end

       dst
     end
  end
end

画像をグレースケールに変換するには、いくつかのパラメーターが配列で imagemagick に送信されます。問題は、どのパラメーターを imagemagick に送信する必要があるかということ"144x144#"です。

ログをたどって、ログでこれがどの"144x144#"ように見えるかを確認しようとしましたが、次のようになっていました: -crop '144x144+30+0'、ジェネレーターで使用して、次のようなパラメーターとして送信しようとしました:

 parameters = []
 parameters << ":source"
 parameters << "-crop '144x144+30+0'"
 parameters << "-colorspace Gray"
 parameters << ":dest"

以前にアップロードしたのと同じ画像を使用するとうまくいったように見えましたが、別の画像をアップロードすると、画像が完全に間違ってトリミングされます。したがって、ペーパークリップによって生成された param:-crop '144x144+30+0'はその特定の画像サイズ用であり、通常、サイズが異なる別の param は 144px に収まるように送信されるという結論に達しました。

ジェネレーターで画像をトリミングして、144x144#ペーパークリップと同等にするにはどうすればよいですか、またはこれを実現するために imagemagick に送信する必要があるパラメーターは何ですか。ありがとうございました。

4

3 に答える 3

3

別の方法を取ることにしたので、目的のサイズのトリミングされたファイルを使用し、imagemagick を使用してそのファイルをグレースケールに変換し、モデルを保存した後に適切なフォルダーに保存します。システムコマンドを使用してimagemagickを操作したため、グレースケールプロセッサを削除できます。

psこの回答にはいくつかの欠点があるかもしれませんが、今のところ何も見つかりませんでした。

Client.rb

  has_attached_file :avatar,
  :path => ":rails_root/public/system/:attachment/:id/:style/:filename",
  :url => "/system/:attachment/:id/:style/:filename",
  :styles => {:thumb => "144x144#", :grayscale => "144x144#"}

  after_save :convert_grayscale

  def convert_grayscale
    system "convert public/system/avatars/#{self.id}/thumb/#{self.avatar.original_filename} -fx '(r+g+b)/3' public/system/avatars/#{self.id}/grayscale/#{self.avatar.original_filename}"
  end

結果

ここに画像の説明を入力

于 2013-10-07T07:11:55.043 に答える