class FlickrCollage

Constants

VERSION

Attributes

collage[RW]
dir[RW]
filename[RW]
image_list[RW]
keywords[RW]
random_keywords[RW]
squares[RW]
unsuccessful_keywords[RW]

Public Class Methods

new(keywords: [], filename: 'collage.jpg', dir: '.', no_of_images: nil, rows: nil, squares: false) click to toggle source
# File lib/flickr_collage.rb, line 14
def initialize(keywords: [], filename: 'collage.jpg', dir: '.', no_of_images: nil, rows: nil, squares: false)
  @filename = filename
  @dir = dir
  @squares = squares
  @no_of_images = no_of_images || (keywords.empty? ? 10 : keywords.length)
  assign_and_extend_keywords(keywords)

  @image_list, @unsuccessful_keywords = FileLoader.image_list(@keywords)

  create_collage(rows: rows || Math.sqrt(@no_of_images).floor)
end

Public Instance Methods

save(force: false) click to toggle source
# File lib/flickr_collage.rb, line 26
def save(force: false)
  path = prepare_and_check_path(force)
  @collage.write(path)
rescue Errors::DirNotFound, Errors::FileExist
  raise
rescue => e
  raise Errors::FileCannotBeSaved, "#{e.class}: #{e.message}"
end
save!() click to toggle source
# File lib/flickr_collage.rb, line 35
def save!
  save(force: true)
end

Private Instance Methods

assign_and_extend_keywords(keywords) click to toggle source
# File lib/flickr_collage.rb, line 41
def assign_and_extend_keywords(keywords)
  @random_keywords = []
  (@no_of_images - keywords.length).times { @random_keywords << Dictionary.words.sample }
  @keywords = keywords + @random_keywords
end
create_collage(rows: 3, width: 1200) click to toggle source
# File lib/flickr_collage.rb, line 47
def create_collage(rows: 3, width: 1200)
  @image_list.scene = 0
  collage_list = Magick::ImageList.new

  height = 0
  rows.times do |i|
    row = create_image_row(no_of_images: images_per_row(rows, i))
    collage_list << row.scale(width.to_f / row.columns)
    collage_list.page = Magick::Rectangle.new(0, 0, 0, height)
    height += collage_list.rows
  end

  @collage = collage_list.mosaic
end
create_image_row(no_of_images:, height: 300) click to toggle source
# File lib/flickr_collage.rb, line 62
def create_image_row(no_of_images:, height: 300)
  row = Magick::ImageList.new

  width = 0
  no_of_images.times do
    row << (@squares ? @image_list.resize_to_fill(height) : @image_list.scale(height.to_f / @image_list.rows))
    row.page = Magick::Rectangle.new(0, 0, width, 0)
    width += row.columns
    increment_image_list_scene
  end

  row.mosaic
end
images_per_row(rows, i) click to toggle source
# File lib/flickr_collage.rb, line 82
def images_per_row(rows, i)
  @no_of_images / rows + (i.positive? && i <= @no_of_images % rows ? 1 : 0)
end
increment_image_list_scene() click to toggle source
# File lib/flickr_collage.rb, line 76
def increment_image_list_scene
  @image_list.scene += 1
rescue
  @image_list.scene = 0
end
prepare_and_check_path(force) click to toggle source
# File lib/flickr_collage.rb, line 86
def prepare_and_check_path(force)
  raise Errors::DirNotFound unless File.directory?(dir.to_s)

  path = File.join(dir, filename)
  raise Errors::FileExist if !force && File.exist?(path)

  path
end