Я столкнулся с непростой проблемой со скрепкой и пользовательскими процессорами, где я теряю некоторые из стилей.
У меня есть картинка, которую я обрезаю с координатами, переданными из вида.
Обрезка прошла хорошо, и исходное изображение сохранено, но при запуске повторной обработки для создания других стилей я получаю эту ошибку:
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