Created
January 13, 2011 06:33
-
-
Save lawitschka/777492 to your computer and use it in GitHub Desktop.
A processor for Paperclip performing standard thumbnailing tasks and adds a logo stamp at specified position to the image
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Image < ActiveRecord::Base | |
has_attached_file :image, :styles => { :small => ['60x60#', :jpg], | |
:thumb => ['150x150#', :jpg], | |
:normal => { | |
:processors => [:logostamp], | |
:geometry => '660x660', | |
:format => :jpg, | |
:logostamp_geometry => "+5+5" | |
} | |
}, | |
:default_style => :normal | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Paperclip | |
# Handles thumbnailing images that are uploaded. | |
class Logostamp < Processor | |
attr_accessor :current_geometry, :target_geometry, :format, :whiny, :convert_options, :source_file_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 = {}, attachment = nil | |
super | |
geometry = options[:geometry] | |
@file = file | |
@crop = geometry[-1,1] == '#' | |
@target_geometry = Geometry.parse geometry | |
@current_geometry = Geometry.from_file @file | |
@source_file_options = options[:source_file_options] | |
@convert_options = options[:convert_options] | |
@whiny = options[:whiny].nil? ? true : options[:whiny] | |
@format = options[:format] | |
@source_file_options = @source_file_options.split(/\s+/) if @source_file_options.respond_to?(:split) | |
@convert_options = @convert_options.split(/\s+/) if @convert_options.respond_to?(:split) | |
@current_format = File.extname(@file.path) | |
@basename = File.basename(@file.path, @current_format) | |
# Logostamp specific options | |
@logostamp_path = options[:logostamp_path] || Rails.root.join('public/images/logostamp.png') | |
@logostamp_position = options[:logostamp_position].nil? ? "SouthEast" : options[:position] | |
@logostamp_geometry = options[:logostamp_geometry] | |
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? | |
!@convert_options.nil? && !@convert_options.empty? | |
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 ? ".#{@format}" : '']) | |
dst.binmode | |
begin | |
parameters = [] | |
parameters << source_file_options | |
parameters << ":source" | |
parameters << transformation_command | |
parameters << convert_options | |
parameters << ":dest" | |
logostamp = [] | |
logostamp << "-gravity #{@logostamp_position}" | |
logostamp << "-geometry #{@logostamp_geometry}" if @logostamp_geometry.present? | |
logostamp << "#{@logostamp_path} #{File.expand_path(dst.path)} #{File.expand_path(dst.path)}" | |
parameters = parameters.flatten.compact.join(" ").strip.squeeze(" ") | |
logostamp = logostamp.flatten.compact.join(" ").strip.squeeze(" ") | |
success = Paperclip.run("convert", parameters, :source => "#{File.expand_path(src.path)}[0]", :dest => File.expand_path(dst.path)) and | |
Paperclip.run("composite", logostamp) | |
rescue PaperclipCommandLineError => e | |
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 << "-resize" << %["#{scale}"] unless scale.nil? || scale.empty? | |
trans << "-crop" << %["#{crop}"] << "+repage" if crop? | |
trans | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
A processor for Paperclip performing standard thumbnailing tasks and adds a logo stamp at specified position to the image.
Possible options are:
:logostamp_geometry => "+5+5"
alongside:logostamp_position => "SouthEast"
option places the stamp in the lower left corner of the image but adds a padding of 5 pixels on the right and the bottom to the stamp. For a complete description see Imagemagick documentation.