class TJStamp

Attributes

background_color[RW]
color[RW]
corner_size[RW]
font[RW]
name[RW]
size[RW]
stroke_width[RW]

Public Class Methods

new(name: '王小明', size: 256, corner_size: 10, stroke_width: 20, font: File.join(__dir__, 'simsun.ttf'), color: 'red', background_color: 'none') click to toggle source
# File lib/tjstamp.rb, line 6
def initialize name: '王小明', size: 256, corner_size: 10, stroke_width: 20, font: File.join(__dir__, 'simsun.ttf'), color: 'red', background_color: 'none'
  self.name = name
  self.size = size
  self.corner_size = corner_size
  self.stroke_width = stroke_width
  self.font = font
  self.color = color
  self.background_color = background_color
end

Public Instance Methods

stamp() click to toggle source
# File lib/tjstamp.rb, line 21
def stamp
  raise 'Length of name must be in (1..4)' unless (1..4) === name.length
  canvas = Magick::Image.new(size, size){ self.background_color = 'none' }

  # square
  square = Magick::Draw.new
  square.stroke(color)
  square.fill(background_color)
  square.stroke_width(stroke_width)
  corner_width = corner_height = corner_size
  upper_x, left_y = stroke_width / 2, stroke_width / 2
  lower_x, right_y = size - stroke_width / 2, size - stroke_width / 2
  square.roundrectangle(upper_x, left_y, lower_x, right_y, corner_width, corner_height)
  # square.polyline(180,70, 173,78, 190,78, 191,62)
  
  square.draw(canvas)

  # text
  text = Magick::Draw.new
  text.font = font
  text.gravity = Magick::CenterGravity
  text.pointsize = size
  chars = name.chars
  
  case name.length
  when 1
    put_char char: chars[0], gravity: Magick::CenterGravity, draw: text, img: canvas
  when 2
    put_char char: chars[0], gravity: Magick::EastGravity, draw: text, img: canvas
    put_char char: chars[1], gravity: Magick::WestGravity, draw: text, img: canvas
  when 3
    put_char char: chars[0], gravity: Magick::EastGravity, draw: text, img: canvas
    put_char char: chars[1], gravity: Magick::NorthWestGravity, draw: text, img: canvas
    put_char char: chars[2], gravity: Magick::SouthWestGravity, draw: text, img: canvas
  when 4
    put_char char: chars[0], gravity: Magick::NorthEastGravity, draw: text, img: canvas
    put_char char: chars[1], gravity: Magick::SouthEastGravity, draw: text, img: canvas
    put_char char: chars[2], gravity: Magick::NorthWestGravity, draw: text, img: canvas
    put_char char: chars[3], gravity: Magick::SouthWestGravity, draw: text, img: canvas
  end
  
  canvas
end
update(**params) click to toggle source
# File lib/tjstamp.rb, line 16
def update **params
  params.each{ |key, value| send("#{key}=", value)}
  self
end

Private Instance Methods

put_char(char: nil, img: nil, draw: nil, gravity: nil, color: color) click to toggle source
# File lib/tjstamp.rb, line 67
def put_char char: nil, img: nil, draw: nil, gravity: nil, color: color
  char_image = Magick::Image.new(size, size){ self.background_color = 'none' }
  char_unit_size = size/2 - stroke_width
  draw.annotate(char_image, 0, 0, 0, 0, char) { self.fill = color }

  w, h, x, y = case gravity
  when Magick::NorthWestGravity, Magick::NorthEastGravity, Magick::SouthWestGravity, Magick::SouthEastGravity
    [char_unit_size, char_unit_size, stroke_width, stroke_width]
  when Magick::WestGravity, Magick::EastGravity
    [char_unit_size, size - stroke_width, stroke_width, 0]
  when Magick::SouthGravity, Magick::NorthGravity
    [size - stroke_width, char_unit_size, 0, stroke_width]
  when Magick::CenterGravity
    [size - stroke_width, size - stroke_width, 0, 0]
  else
    raise 'Missing gravity'
  end

  img.composite!(char_image.resize!(w, h), gravity, x, y, Magick::OverCompositeOp)
  char_image.destroy!
end