Cropping with Attachment Fu

Hello-

I'm trying to work out the options for cropping an image into a square image. Basically, I want a picture turned into a 200x200 image. If the source picture is in landscape mode, then I want slivers of the right and left hand side of the picture cut off. If the source is in portrait mode, then the slivers would be on the top and bottom. Does anyone have an example of this sort of configuration?

Regards- Eric

Eric Marthinsen wrote:

Hello-

I'm trying to work out the options for cropping an image into a square image. Basically, I want a picture turned into a 200x200 image. If the source picture is in landscape mode, then I want slivers of the right and left hand side of the picture cut off. If the source is in portrait mode, then the slivers would be on the top and bottom. Does anyone have an example of this sort of configuration?

Regards- Eric

Hi Eric

This link should help; http://brendanlim.com/2007/7/28/crop-images-using-attachment_fu-and-rmagick

However, if you can afford to do so, I would consider swapping attachment_fu for the Paperclip plugin - it makes cropped thumbnails really, really easy;

http://jimneath.org/2008/04/17/paperclip-attaching-files-in-rails/

Thanks Neil-

The first link helped a lot. I like the look of Paperclip as well. I might have to try it out on my next project.

-Eric

If you don't want to rewrite any of the attachment_fu files (which might make updates a little bit of a problem) try this instead. Put the following code into whichever model has has_attachment

protected

  def resize_image(img, size)     # resize_image take size in a number of formats, we just want     # Strings in the form of "crop: WxH"     if (size.is_a?(String) && size =~ /^crop: (\d*)x(\d*)/i) ||         (size.is_a?(Array) && size.first.is_a?(String) &&           size.first =~ /^crop: (\d*)x(\d*)/i)       img.crop_resized!($1.to_i, $2.to_i)       # We need to save the resized image in the same way the       # orignal does.       self.temp_path = write_to_temp_file(img.to_blob)     else       super # Otherwise let attachment_fu handle it     end   end

This will override the resize_image method in attachment_fu. Now instead of something like

  has_attachment :content_type => :image,                  :storage => :s3,                  :max_size => 1024.kilobytes,                  :resize_to => '256x160>',                  :thumbnails => {:thumb => '100x100>', :tiny => '50x50'},                  :processor => 'Rmagick'

you can do

  has_attachment :content_type => :image,                  :storage => :s3,                  :max_size => 1024.kilobytes,                  :resize_to => '256x160>',                  :thumbnails => {:thumb => 'crop: 100x100>', :tiny => 'crop: 50x50'},                  :processor => 'Rmagick'

(Notice that thumb and tiny changed to 'crop: XxX'). If you leave crop out it will work as normal, put crop in and it crops the image down to the right size. This works with RMagick - in particular the crop_resized call, I don't know how to do this for ImageMagick or any of the other libs - sorry.

D.