Rails 3.1使用自定义处理器和裁剪的Paperclip错误

时间:2011-11-14 01:23:01

标签: ruby-on-rails ruby imagemagick paperclip

我在回形针和自定义处理器方面遇到了一个棘手的问题,我失去了一些风格。

我有一张用裁剪传来的坐标裁剪的照片。 裁剪进行得很顺利,保存了原始图片,但是当运行重新处理以生成其他样式时,我收到此错误:

convert: geometry does not contain image `/var/folders/bg/w2mft0x51t933pzhgpvhm5800000gn/T/paperclip-reprocess20111114-3404-13lp780-0' @ warning/transform.c/CropImage/571.

当我收到此错误时原始图像样式丢失

我尝试了回调和回形针的东西,但没有成功。我真的被卡住了,无法找到有关此事的任何信息。

我所遵循的例子来自http://railscasts.com/episodes/182-cropping-images

与截屏视频中的示例有什么不同之处在于我想裁剪原始内容,然后使用标准回形针样式从中生成缩略图。

这是我的代码。

我的处理器:

module Paperclip

  class Cropper < Thumbnail
    def transformation_command
      if crop_command
        original_command = super
        if original_command.include?('-crop')
          original_command.delete_at(super.index('-crop') + 1)
          original_command.delete_at(super.index('-crop'))
        end
        crop_command + original_command
      else
        super
      end
    end

    def crop_command
      target = @attachment.instance
      if target.cropping?
        ["-crop", "#{target.crop_w.to_i}x#{target.crop_h.to_i}+#{target.crop_x.to_i}+#{target.crop_y.to_i}", "+repage"]
      end
    end
  end

end

我的模特:

class Item < ActiveRecord::Base

  belongs_to :category
  belongs_to :picture

  validates :picture_id,  :presence => true
  validates :category_id, :presence => true

  validates :title_url,   :presence => true, :uniqueness => { :case_sensitive => false }
  validates :title,       :presence => true, :uniqueness => { :case_sensitive => false }
  validates :information, :presence => true, :uniqueness => { :case_sensitive => false }

  validates :crop_x,      :presence => true, :numericality => { :only_integer => true, :greater_than_or_equal_to => 0 }
  validates :crop_y,      :presence => true, :numericality => { :only_integer => true, :greater_than_or_equal_to => 0 }
  validates :crop_w,      :presence => true, :numericality => { :only_integer => true, :greater_than_or_equal_to => 0 }
  validates :crop_h,      :presence => true, :numericality => { :only_integer => true, :greater_than_or_equal_to => 0 }

  Paperclip.interpolates :title_url do |attachment, style|
    attachment.instance.title_url
  end

  has_attached_file :image,
                    :styles => {
                      :small    => { :format => 'jpg', :quality => 100, :geometry => '100x100#' },
                      :medium   => { :format => 'jpg', :quality => 100, :geometry => '200x200#' },
                      :large    => { :format => 'jpg', :quality => 100, :geometry => '300x300#' },
                      :original => { :format => 'jpg', :quality => 100, :geometry => '', :processors => [:cropper] }
                    },
                    :path => ":rails_root/public/attachments/:class/:attachment/:id_partition/:style/:title_url.:extension",
                    :url  =>                   "/attachments/:class/:attachment/:id_partition/:style/:title_url.:extension"

  before_validation   :strip_attributes
  before_save         :image_assign,    :if => :cropping?
  after_create        :image_reprocess, :if => :cropping?

  def cropping?
    !crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank?
  end

  def image_geometry(style = :original)
    @geometry ||= {}
    @geometry[style] ||= Paperclip::Geometry.from_file(avatar.path(style))
  end

  def calc(width,height)
    # original large side / smalled picture large side
    calc_width  = self.picture.width.to_f  / width
    calc_height = self.picture.height.to_f / height
    if calc_width >= calc_height
      return calc_width
    else
      return calc_height
    end
  end

  private

  def image_assign
    self.image = self.picture.image
  end

  def image_reprocess
    image.reprocess!
  end

  def strip_attributes
    # normalize attributes
    self.title.strip!
    self.title_url = Utility::friendly_url(self.title)
    self.information.strip!
  end

end

1 个答案:

答案 0 :(得分:4)

因为我看到至少有一个人遇到了问题我正在分享我对定制回形针处理器裁剪问题的最终解决方案。有一些东西,如居中图片裁剪。我很确定这远非完美,但它已经可靠地工作了大约一年。

module Paperclip

  class CropperItem < Thumbnail
    def transformation_command
      if crop_command
        original_command = super
        if original_command.include?('-crop')
          original_command.delete_at(super.index('-crop') + 1)
          original_command.delete_at(super.index('-crop'))
        end
        if original_command.include?('-resize')
          crop_command('square') + original_command
        else
          crop_command + original_command
        end
      else
        super
      end
    end

    def crop_command(dimensions = nil)
      target = @attachment.instance
      if target.cropping?
        case dimensions
        when 'square'
          if target.crop_w > target.crop_h
            crop_w = target.crop_w.to_i
            crop_h = target.crop_w.to_i
            crop_x = target.crop_x.to_i
            crop_y = target.crop_y.to_i - ((target.crop_w.to_i-target.crop_h.to_i)/2).to_i
            crop_x = 0 if crop_x < 0
            crop_y = 0 if crop_y < 0
          elsif target.crop_w < target.crop_h
            crop_w = target.crop_h.to_i
            crop_h = target.crop_h.to_i
            crop_x = target.crop_x.to_i - ((target.crop_h.to_i-target.crop_w.to_i)/2).to_i
            crop_y = target.crop_y.to_i
            crop_x = 0 if crop_x < 0
            crop_y = 0 if crop_y < 0
          else
            crop_w = target.crop_w.to_i
            crop_h = target.crop_h.to_i
            crop_x = target.crop_x.to_i
            crop_y = target.crop_y.to_i
          end
          ["-crop", "#{crop_w}x#{crop_h}+#{crop_x}+#{crop_y}", "+repage"]
        else
          ["-crop", "#{target.crop_w.to_i}x#{target.crop_h.to_i}+#{target.crop_x.to_i}+#{target.crop_y.to_i}", "+repage"]
        end
      end
    end
  end

end

我最终在模型中使用了类似的东西。

has_attached_file :photo,
                  :styles => {
                    :small        => { :format => 'jpg', :quality => 100, :geometry => '50x50^'   },
                    :thumb_small  => { :format => 'jpg', :quality => 100, :geometry => '110x110^' },
                    :thumb_medium => { :format => 'jpg', :quality => 100, :geometry => '150x150^' },
                    :medium       => { :format => 'jpg', :quality => 100, :geometry => '240x160^' },
                    :banner_small => { :format => 'jpg', :quality => 100, :geometry => '200x120#' },
                    :banner       => { :format => 'jpg', :quality => 100, :geometry => '300x250^' },
                    :focus_crop   => { :format => 'jpg', :quality => 100, :geometry => '400x400>' },
                    :focus_orig   => { :format => 'jpg', :quality => 100, :geometry => '' }
                  },
                  :convert_options => {
                    :thumb_small  => "-gravity Center -extent 50x50",
                    :thumb_small  => "-gravity Center -extent 110x110",
                    :thumb_medium => "-gravity Center -extent 150x150",
                    :medium       => "-gravity Center -extent 240x160",
                    :banner_small => "-gravity Center -extent 200x120",
                    :banner       => "-gravity Center -extent 300x250",
                    :focus_crop   => "-gravity Center"
                  },
                  :processors => [:cropper_item],
                  :path => PAPERCLIP_PATH,
                  :url  => PAPERCLIP_URL

我希望这有助于某人。