2013-10-06 49 views
1

Client.rb回形針ImageMagick的轉換爲灰度和作物,以適應144x144#

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] }} 

拇指版本版本的偉大工程,圖像裁剪到所需的大小,灰度轉換僅是圖像灰度,但圖像沒有被裁剪,這裏的灰階發生器,我在計算器上找到:

的lib/grayscale.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',我試圖用它在我的發電機,並把它作爲PARAMS像:

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

如果我使用與之前上傳的圖像相同的圖像,看起來像是有用的,如果我上傳另一張圖像,則圖像完全被裁剪錯誤。所以我得出的結論是,由回形針生成的param:-crop '144x144+30+0'是針對該特定圖像尺寸的,而對於具有不同尺寸的另一個,通常會發送不同的參數以適應144px。

如何裁剪生成器中的圖像以適合等效於144x144#的回形針或我需要發送給imagemagick以實現此目的的參數是什麼。謝謝。

回答

3

我決定走另一條路,所以我只是使用具有所需大小的裁剪文件,並使用imagemagick將該格式轉換爲灰度並在模型保存後將其保存到正確的文件夾中。當我使用系統命令來處理imagemagick時,可以刪除灰度處理器。

p.s.這個答案可能有一些缺點,但現在我找不到任何答案。

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 

結果

enter image description here

2

經過反覆試驗,我發現了一個更簡單的方法來做到這一點。使用您發現的灰度處理器代碼,將其放入lib/paperclip/grayscale.rb

然後,設置您的樣式,像這樣:

:styles => { 
    :thumb => "144x144#", 
    :grayscale => { :geometry => "144x144#", :processors => [:grayscale, :thumbnail] } 
} 

這樣,灰度風格將通過灰度處理器,並使用所提供的「幾何」的縮略圖處理器都進行處理。作爲獎勵,您可以使用Paperclip內置的rake任務重新處理現有附件。

3

爲了簡單起見,你可以追加到convert直接,convert_options:

例如

has_attached_file :file, styles: { 
    ir: '640x640>', 
    thumb: '150x150>' 
    } 

變爲:

has_attached_file :file, styles: { 
    ir: {geometry: '640x640>', convert_options: '-colorspace Gray'}, 
    thumb: '150x150>' 
    } 
+0

這是迄今爲止最清潔的選擇。感謝你,@TomDunning! –