Skip to content

Instantly share code, notes, and snippets.

@rsmithlal
Forked from ardianys/watermark.rb
Last active January 15, 2020 12:19
Show Gist options
  • Save rsmithlal/6427646845fbb8a882c3 to your computer and use it in GitHub Desktop.
Save rsmithlal/6427646845fbb8a882c3 to your computer and use it in GitHub Desktop.
Working Paperclip 4.2.0 watermark processor for Rails 4.x.x and Ruby 2.x.x
# Rails.root /app/models/user.rb
class User
has_attached_file :photo,
styles: {
medium: {
processors: [:watermark],
geometry: "300x300>",
watermark_path: "#{Rails.root}/public/images/watermark.png"
convert_options: { "-strip -auto-orient -colorspace sRGB" } #or whatever options you want
},
thumb: "100x100>",
}
end
# Rails.root /lib/paperclip_processors/watermark.rb
module Paperclip
class Watermark < Processor
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
@convert_options = options[:convert_options]
@whiny = options[:whiny].nil? ? true : options[:whiny]
@format = options[:format]
@watermark_path = options[:watermark_path]
@position = options[:position].nil? ? "Center" : options[:position]
@watermark_offset = options[:watermark_offset]
@overlay = options[:overlay].nil? ? true : false
@current_format = File.extname(@file.path)
@basename = File.basename(@file.path, @current_format)
# Rails.logger.info "watermark initialized"
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 watermark. Returns the Tempfile
# that contains the new image.
def make
# Rails.logger.info "watermark make method"
src = @file
dst = Tempfile.new([@basename].compact.join("."))
dst.binmode
if @watermark_path.present?
command = "convert"
params = %W['#{fromfile}']
params += transformation_command
params += %W['#{@watermark_path}' -gravity #{@position} -composite]
params << "'#{tofile(dst)}'"
else
command = "convert"
params = ["'#{fromfile}'"]
params += transformation_command
params << "'#{tofile(dst)}'"
end
Rails.logger.info 'params:' + params.to_s
begin
Paperclip.run(command, params.join(' '))
rescue ArgumentError
raise Paperclip::Error.new("There was an error processing the watermark for #{@basename}") if @whiny
end
dst
end
def transformation_command
scale, crop = @current_geometry.transformation_to(@target_geometry, crop?)
trans = %W[-resize '#{scale}']
trans += %W[-crop '#{crop}' +repage] if crop
trans << @convert_options if @convert_options.present?
trans
end
def fromfile
File.expand_path(@file.path)
end
def tofile(destination)
File.expand_path(destination.path)
end
end
end
@rsmithlal
Copy link
Author

Happy to share! Thanks for pointing that out @b1nary! I had originally modified and got working an example watermark processor for an older paperclip version that was provided by someone else, and at the time I was pretty new to programming and didn't think anything of it. Will remove it from my source code. Cheers!

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