【问题标题】:Rails Paperclip how to use filter options of ImageMagick?Rails Paperclip 如何使用 ImageMagick 的过滤选项?
【发布时间】:2011-05-25 01:40:10
【问题描述】:

我最近使用 Rails 实现了 Paperclip,并想尝试一些 ImageMagick 的过滤器选项,例如 blur。我无法找到任何有关如何执行此操作的示例。它是否通过 :style 作为另一种选择?

:styles => { :medium => "300x300#", :thumb => "100x100#" }

@plang 的回答是正确的,但我想给出模糊的确切解决方案,以防万一有人在寻找并发现这个问题:

:convert_options => { :all => "-blur 0x8" }
// -blur  {radius}x{sigma} 

改变了这个:

致此:

【问题讨论】:

    标签: ruby-on-rails imagemagick paperclip


    【解决方案1】:

    我没有对此进行测试,但您应该可以使用“convert_options”参数,如下所示:

    :convert_options => { :all => ‘-colorspace Gray’ }
    

    看看https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/thumbnail.rb

    我个人使用自己的处理器。

    在模型中:

      has_attached_file :logo,
                        :url  => PaperclipAssetsController.config_url,
                        :path => PaperclipAssetsController.config_path,
                        :styles => {
                                     :grayscale => { :processors => [:grayscale] }
                                   }
    

    在库中:

    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
    

    对于简单的灰度转换,这可能不是 100% 必要的,但它确实有效!

    【讨论】:

    • 嗯,感觉在转换选项中添加更容易:styles =&gt; { :grey =&gt; "450x250" }, :convert_options =&gt; {:grey =&gt; "-blur 0x8"}
    【解决方案2】:

    Rails 5、Paperclip 5 更新

    现在不必添加库,您只需在系统上调用ImageMagick's convert command 即可使用其grayscale option。您可以对模糊或任何其他 ImageMagick 选项执行相同操作,但我需要这样做才能转换为灰度。

    在您的模型中(带有徽标的客户端):

    class Client < ApplicationRecord
      has_attached_file :logo,
                        styles: { thumb: "243x243#", grayscale: "243x243#" }
      # ensure it's an image
      validates_attachment_content_type :logo, content_type: /\Aimage\/.*\z/
    
      # optional, just for name and url to be required
      validates :name, presence: true
      validates :url, presence: true
    
      after_save :convert_grayscale
    
      def convert_grayscale
        system "convert #{self.logo.path(:thumb)} -grayscale Rec709Luminance #{self.logo.path(:grayscale)}"
      end
    
      def logo_attached?
        self.logo.file?
      end
    end
    

    然后像这样在视图中使用(根据Paperclips github docs)。

    在你看来:

    <%= image_tag(client.logo.url(:grayscale), class: 'thumbnail', alt: client.name, title: client.name) %>
    

    如果您愿意,也可以提供链接:

    <%= link_to(image_tag(client.logo.url(:grayscale), class: 'thumbnail', alt: client.name, title: client.name), client.url ) %>
    

    【讨论】:

      猜你喜欢
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      相关资源
      最近更新 更多