-
-
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
This file contains hidden or 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
# 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 |
Random cocaine dependency. However thanks a lot!
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
Great, thanks!