I was looking at some options for the Image Cropping functionality with Rails 3 and got many great solutions on the net. This Rails Cast is the best place to start if you have the images stored as local. If you have it as s3 storage there are some changes you need to make.
My main haml file has these contents -
When on calls the popup, one should call the code for the Jcrop method
My aspect ratio setting is with respect to the configurations I did for the has_attached_file :avatar.
The thing you will have to do specifically for s3 is in the avatar_geometry method.
Inside the model.
I'm having issues with the cropper processor and its not cropping fine. Will have to fix that. This is the Cropper
My main haml file has these contents -
#cropperpopup.lpopup.x
%a.ccloser
%p.large
Image Cropper
.cropper
= image_tag @user.avatar.url(:medium), :id => :cropbox
= form_for @user, :html => {:class => 'edit_user_two'} do |f|
- for attrbt in [:crop_x, :crop_y, :crop_w, :crop_h]
= f.text_field attrbt, :id => attrbt, :class => :coordinate
= f.submit 'Crop'
When on calls the popup, one should call the code for the Jcrop method
$('img#cropbox').Jcrop({
onChange: update_crop,
onSelect: update_crop,
setSelect: [0, 0, 168, 202],
aspectRatio: (168/202) });
My aspect ratio setting is with respect to the configurations I did for the has_attached_file :avatar.
The thing you will have to do specifically for s3 is in the avatar_geometry method.
def cropping?
!crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank?
end
def avatar_geometry(style = :medium)
@geometry ||= {}
path = (avatar.options[:storage]==:s3) ? avatar.url(style).split(' ').join('%20') : avatar.path(style)
@geometry[style] ||= Paperclip::Geometry.from_file(path)
end
Inside the model.
I'm having issues with the cropper processor and its not cropping fine. Will have to fix that. This is the Cropper
module Paperclip
class Cropper < Thumbnail
def transformation_command
if crop_command
r = super
if r.class == Array
r = r.join(' ')
end
crop_command + r.sub(/ -crop \S+/, '').sub(/-resize \S+/, '')
else
super
end
end
def crop_command
target = @attachment.instance
if target.cropping?
"-resize \"168x202\" -crop #{target.crop_w}x#{target.crop_h}+#{target.crop_x}+#{target.crop_y} "
end
end
end
end