class Photomosaic::Image
Public Class Methods
create_mosaic_image(image_list, output_path)
click to toggle source
# File lib/photomosaic/image.rb, line 5 def self.create_mosaic_image(image_list, output_path) image_list.inject(Magick::ImageList.new) do |images, row| images << row.inject(Magick::ImageList.new) do |col_images, image| col_images << image.image.dup col_images end.append(false) images end.append(true).write(output_path) end
new(image_path)
click to toggle source
# File lib/photomosaic/image.rb, line 30 def initialize(image_path) @image = Magick::Image.read(image_path).first end
preprocess_image(image_path, width, height, level, colors)
click to toggle source
# File lib/photomosaic/image.rb, line 16 def self.preprocess_image(image_path, width, height, level, colors) image = Photomosaic::Image.new(image_path) image.resize!(width, height, true) image.posterize!(level) image.reduce_colors!(colors) image end
resize_images(images, width, height)
click to toggle source
# File lib/photomosaic/image.rb, line 24 def self.resize_images(images, width, height) images.map do |row| row.map { |image| image.resize!(width, height, false) } end end
Public Instance Methods
characteristic_color(color_model = :rgb)
click to toggle source
# File lib/photomosaic/image.rb, line 34 def characteristic_color(color_model = :rgb) @characteristic_color ||= get_characteristic_color(color_model) end
dispatch_images(source_image_list, row_step = 1, col_step = 1, color_model = :rgb)
click to toggle source
# File lib/photomosaic/image.rb, line 38 def dispatch_images(source_image_list, row_step = 1, col_step = 1, color_model = :rgb) (1..image_height).step(row_step).inject([]) do |images, y| images << (1..image_width).step(col_step).inject([]) do |col_images, x| col_images << nearest_image(source_image_list, x, y, color_model) col_images end images end end
image()
click to toggle source
# File lib/photomosaic/image.rb, line 49 def image @image end
posterize!(level)
click to toggle source
# File lib/photomosaic/image.rb, line 53 def posterize!(level) @image = @image.posterize(level) reload_image self end
reduce_colors!(colors)
click to toggle source
# File lib/photomosaic/image.rb, line 59 def reduce_colors!(colors) @image = @image.quantize(colors) reload_image self end
resize!(width, height, keep_ratio)
click to toggle source
# File lib/photomosaic/image.rb, line 65 def resize!(width, height, keep_ratio) keep_ratio ? @image.resize_to_fit!(width, height) : @image.resize!(width, height) reload_image self end
Private Instance Methods
get_characteristic_color(color_model = :rgb)
click to toggle source
# File lib/photomosaic/image.rb, line 73 def get_characteristic_color(color_model = :rgb) color = nil original_image = @image.dup begin resize!(1, 1, false) color = pixel_color(1, 1, color_model) ensure @image = original_image end color end
image_height()
click to toggle source
# File lib/photomosaic/image.rb, line 105 def image_height @image.rows end
image_width()
click to toggle source
# File lib/photomosaic/image.rb, line 109 def image_width @image.columns end
nearest_image(source_image_list, x, y, color_model)
click to toggle source
# File lib/photomosaic/image.rb, line 87 def nearest_image(source_image_list, x, y, color_model) pixel = pixel_color(x, y, color_model) source_image_list.sort_by do |image| image.characteristic_color(color_model).calculate_distance(pixel) end.first end
pixel_color(x, y, color_model = :rgb)
click to toggle source
# File lib/photomosaic/image.rb, line 95 def pixel_color(x, y, color_model = :rgb) pixel = @image.pixel_color(x, y) rgb = Color::RGB.new(pixel.red / 257, pixel.green / 257, pixel.blue / 257) color_model == :rgb ? rgb : rgb.to_hsv end
reload_image()
click to toggle source
# File lib/photomosaic/image.rb, line 101 def reload_image @image = Magick::Image.from_blob(@image.to_blob).first end