我在回形针和自定义处理器方面遇到了一个棘手的问题,我失去了一些风格。
我有一张用裁剪传来的坐标裁剪的照片。 裁剪进行得很顺利,保存了原始图片,但是当运行重新处理以生成其他样式时,我收到此错误:
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
答案 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
我希望这有助于某人。