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.