Skip to content

Instantly share code, notes, and snippets.

@zyphlar
Last active May 18, 2019 19:48
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zyphlar/4b2a86aca41cb7d1280d to your computer and use it in GitHub Desktop.
Save zyphlar/4b2a86aca41cb7d1280d to your computer and use it in GitHub Desktop.
Adds Watermarking ability to Refile

Usage:

#fill_watermark_text(img, width, height, text, gravity = "Center")
attachment_url(object, :attachment, :fill_watermark_text, 800, 600, "My Watermark")
# config/initializers/refile.rb
require "refile/watermark"
# lib/refile/watermark.rb
require "refile"
require "mini_magick"
module Refile
# Adds watermarking to Refile
class Watermark
# @param [Symbol] method The method to invoke on {#call}
def initialize(method)
@method = method
end
# Watermarks the image with another image, and also uses the fill processor
# to resize the initial image
#
# The resulting image will always be exactly as large as the specified
# dimensions.
#
# By default, the watermark and original image will be placed in the center but this can be
# changed via the `gravity` option.
#
# @param [MiniMagick::image] img the background image which will be modified
# @param [#to_s] width the width to fill out
# @param [#to_s] height the height to fill out
# @param [string] watermark_image_filename the image to use as watermark (file must be in the app/assets/images folder)
# @param [string] gravity which part of the image to focus on and put the watermark on
# @return [void]
# @see http://www.imagemagick.org/script/command-line-options.php#gravity
def fill_watermark_image(img, width, height, watermark_image_filename, gravity = "Center")
Refile::MiniMagick.new(:fill).fill(img, width, height, gravity)
second_image = ::MiniMagick::Image.new(Rails.root.join('app', 'assets', 'images', watermark_image_filename).to_s)
result = img.composite(second_image) do |composite|
composite.compose "Over" # OverCompositeOp
#composite.geometry "+20+20" # copy second_image onto first_image from (20, 20)
composite.dissolve "20,100" # make second_image 50% transparent on top of first image
composite.gravity gravity
end
result.write img.path
end
# Watermarks the image with text, and also uses the fill processor
# to resize the initial image
#
# The resulting image will always be exactly as large as the specified
# dimensions.
#
# By default, the original image will be placed in the center.
# The watermark will always be on the middle-right.
#
# @param [MiniMagick::image] img the background image which will be modified
# @param [#to_s] width the width to fill out
# @param [#to_s] height the height to fill out
# @param [string] watermark_image_filename the image to use as watermark (file must be in the app/assets/images folder)
# @param [string] gravity which part of the image to focus on
# @return [void]
# @see http://www.imagemagick.org/script/command-line-options.php#gravity
def fill_watermark_text(img, width, height, text, gravity = "Center")
Refile::MiniMagick.new(:fill).fill(img, width, height, gravity)
boxheight = (height.to_i*0.8).round(2) - (height.to_i*0.4).round(2)
fontsize = (boxheight / 4)
img.combine_options do |c|
c.draw "fill #cccccc fill-opacity 0.4 roundrectangle #{(width.to_i*0.6).round(2)},#{(height.to_i*0.4).round(2)} #{width},#{(height.to_i*0.8).round(2)} 10,10"
c.pointsize fontsize
c.draw "fill #000000 fill-opacity 1 text #{(width.to_i*0.6+10).round(2)},#{(height.to_i*0.8-(boxheight/8)).round(2)} \"#{text}\""
end
end
# Process the given file. The file will be processed via one of the
# instance methods of this class, depending on the `method` argument passed
# to the constructor on initialization.
#
# If the format is given it will convert the image to the given file format.
#
# @param [Tempfile] file the file to manipulate
# @param [String] format the file format to convert to
# @return [File] the processed file
def call(file, *args, format: nil, &block)
img = ::MiniMagick::Image.new(file.path)
img.format(format.to_s.downcase, nil) if format
send(@method, img, *args, &block)
::File.open(img.path, "rb")
end
end
end
# Register Watermark as a valid Refile processor
[:fill_watermark_image, :fill_watermark_text].each do |name|
Refile.processor(name, Refile::Watermark.new(name))
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment