Skip to content

Instantly share code, notes, and snippets.

@lawitschka
Created January 13, 2011 06:33
Show Gist options
  • Save lawitschka/777492 to your computer and use it in GitHub Desktop.
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
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
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
@lawitschka
Copy link
Author

A processor for Paperclip performing standard thumbnailing tasks and adds a logo stamp at specified position to the image.

Possible options are:

  • logostamp_path: Path to the logo file. Defaults to RAILS_ROOT/public/images/logostamp.png
  • logostamp_position: Where to place the stamp? Possible options are NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast
  • logostamp_geometry: Advanced geometry configuration for placing the stamp. E.g. :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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment