如何使用回形针手动裁剪图像?

时间:2015-02-06 17:07:14

标签: ruby-on-rails image ruby-on-rails-4 paperclip minimagick

我正在使用Rails 4.2和Mongoid建立一个网站。我正在使用mongoid-paperclip,我试图将图像裁剪为正方形,同时保留短边的尺寸(因此图像将填满整个正方形)。这是我的自定义处理器:

module Paperclip
  class Cropper < Thumbnail
    def initialize(file, options = {}, attachment = nil)
      super
      @preserved_size = [@current_geometry.width, @current_geometry.height].min
      @current_geometry.width = @preserved_size
      @current_geometry.height = @preserved_size
     end

    def target
      @attachment.instance
    end

    def transformation_command
      if crop_command
        crop_command + super.join(' ').sub(/ -crop \S+/, '').split(' ')
      else
        super
      end
    end

    def crop_command
      ["-crop", "#{@preserved_size}x#{@preserved_size}+#{@preserved_size}+#{@preserved_size}"]
    end
  end
end

它附加的模型看起来像这样:

has_mongoid_attached_file :image, styles: {square: {processors: [:cropper]}}

但它似乎不起作用。一个名为&#39; square&#39;的图像版本已保存,但与原始版本相同。我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:2)

我能够在不使用回形针处理器的情况下解决这个问题。在我的模型中,我使用lambda:

为图像指定了styles
has_mongoid_attached_file :image, styles: lambda {|a|
                                            tmp = a.queued_for_write[:original]
                                            return {} if tmp.nil?
                                            geometry = Paperclip::Geometry.from_file(tmp)
                                            preserved_size = [geometry.width.to_i, geometry.height.to_i].min
                                            {square: "#{preserved_size}x#{preserved_size}#"}
                                          }

请注意,尺寸末尾的#确保裁剪后的图像始终是指定尺寸,而不是仅缩小图像。