Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@sprsquish
Created February 8, 2009 19:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save sprsquish/60470 to your computer and use it in GitHub Desktop.
Save sprsquish/60470 to your computer and use it in GitHub Desktop.
class ImageModelsController < ApplicationController
before_filter :find_image_model, :only => [:update]
def update
if @image_model.update_attributes(params[:image_model])
@image_model.image.reprocess!
end
end
protected
def find_image_model
@image_model = ImageModel.find params[:id]
end
end
$(function() {
function setCropMarks(c) {
$('#crop_x').val(c.x);
$('#crop_y').val(c.y);
$('#crop_w').val(c.w);
$('#crop_h').val(c.h);
}
$.globalEval('var cropSettings = '+$('#crop_settings').val())
$('.crop img').Jcrop({
setSelect: cropSettings,
onChange: setCropMarks,
onSelect: setCropMarks
});
});
<% form_for @image_model do |f| %>
<div class='crop'><%= image_tag(@image_model.image.url) %></div>
<%= f.hidden_field :crop_x, :id => 'crop_x' %>
<%= f.hidden_field :crop_y, :id => 'crop_y' %>
<%= f.hidden_field :crop_w, :id => 'crop_w' %>
<%= f.hidden_field :crop_h, :id => 'crop_h' %>
<%= hidden_field_tag :crop_settings, @image_model.crop_settings.to_json %>
<% end %>
# Jcropper paperclip processor
#
# This processor very slightly changes the default thumbnail processor in order to work properly with Jcrop
# the jQuery cropper plugin.
module Paperclip
# Handles thumbnailing images that are uploaded.
class Jcropper < Processor
attr_accessor :current_geometry, :target_geometry, :format, :whiny, :convert_options
# Creates a Thumbnail object set to work on the +file+ given. It
# will attempt to transform the image into one defined by +target_geometry+
# which is a "WxH"-style string. +format+ will be inferred from the +file+
# unless specified. Thumbnail creation will raise no errors unless
# +whiny+ is true (which it is, by default. If +convert_options+ is
# set, the options will be appended to the convert command upon image conversion
def initialize file, options = {}
super
geometry = options[:geometry]
@file = file
@crop = geometry[-1,1] == '#'
@target_geometry = Geometry.parse geometry
@current_geometry = Geometry.from_file @file
@convert_options = options[:convert_options]
@whiny = options[:whiny].nil? ? true : options[:whiny]
@format = options[:format]
@current_format = File.extname(@file.path)
@basename = File.basename(@file.path, @current_format)
end
# Returns true if the +target_geometry+ is meant to crop.
def crop?
@crop
end
# Returns true if the image is meant to make use of additional convert options.
def convert_options?
not @convert_options.blank?
end
# Performs the conversion of the +file+ into a thumbnail. Returns the Tempfile
# that contains the new image.
def make
src = @file
dst = Tempfile.new([@basename, @format].compact.join("."))
dst.binmode
command = <<-end_command
"#{ File.expand_path(src.path) }[0]"
#{ transformation_command }
"#{ File.expand_path(dst.path) }"
end_command
begin
success = Paperclip.run("convert", command.gsub(/\s+/, " "))
rescue PaperclipCommandLineError
raise PaperclipError, "There was an error processing the thumbnail for #{@basename}" if @whiny
end
dst
end
# Returns the command ImageMagick's +convert+ needs to transform the image
# into the thumbnail.
def transformation_command
scale, crop = @current_geometry.transformation_to(@target_geometry, crop?)
trans = ''
trans << " #{convert_options}" if convert_options?
trans << " -resize \"#{scale}\""
trans << " -crop \"#{crop}\" +repage" if crop
trans
end
end
end
# Example usage of Jcropper
# == Schema Information
# Table name: image_models
#
# id :integer(4) not null, primary key
# image_file_name :string(255)
# image_content_type :string(255)
# image_file_size :integer(4)
# image_updated_at :datetime
# crop_x :integer(4) default(0)
# crop_y :integer(4) default(0)
# crop_h :integer(4) default(0)
# crop_w :integer(4) default(0)
#
class ImageModel < ActiveRecord::Base
has_attached_file :image,
:styles => {
:resized => '120x41>',
:cropped => '100%x100%'
},
:processors => [:jcropper],
:convert_options => { :all => proc { |m| "-crop #{m.crop_w}x#{m.crop_h}+#{m.crop_x}+#{m.crop_y}" } }
def crop_settings
[crop_x, crop_y, (crop_x+crop_w), (crop_y+crop_h)]
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment