class Compatriot::ColorDiffer

Public Class Methods

color_difference_of_pixels(pixel1, pixel2) click to toggle source
# File lib/compatriot/image_differ/color_differ.rb, line 58
def self.color_difference_of_pixels(pixel1, pixel2)
  score = Math.sqrt(
    (r(pixel2) - r(pixel1)) ** 2 +
    (g(pixel2) - g(pixel1)) ** 2 +
    (b(pixel2) - b(pixel1)) ** 2
  ) / Math.sqrt(MAX ** 2 * 3)

  [grayscale(MAX - (score * MAX).round), score]
end
color_difference_percentage(image, diff) click to toggle source

Not called anywhere

# File lib/compatriot/image_differ/color_differ.rb, line 69
def self.color_difference_percentage(image, diff)
  return 0 if diff.length == 0
  (diff.reduce(:+) / image.pixels.length) * 100
end
create_directory_if_necessary(file) click to toggle source
# File lib/compatriot/image_differ/color_differ.rb, line 53
def self.create_directory_if_necessary(file)
  dir = File.dirname(file)
  FileUtils.mkdir_p(dir) unless File.directory?(dir)
end
diff(filename1, filename2) click to toggle source
# File lib/compatriot/image_differ/color_differ.rb, line 26
def self.diff(filename1, filename2)
  image1 = ChunkyPNG::Image.from_file(filename1)
  image2 = ChunkyPNG::Image.from_file(filename2)

  output = ChunkyPNG::Image.new(image1.width, image1.height, WHITE)
  diff = []

  each_pixel(image1) do |x, y|
    pixel1 = image1[x,y]
    pixel2 = image2[x,y]
    unless pixel1 == pixel2
      output[x,y], score = color_difference_of_pixels(pixel1, pixel2)
      diff << score
    end
  end

  save_diff_image(output, File.basename(filename1), File.basename(filename2))

  diff
end
diff_to_file(filename1, filename2, output_filename) click to toggle source
# File lib/compatriot/image_differ/color_differ.rb, line 7
def self.diff_to_file(filename1, filename2, output_filename)
  image1 = ChunkyPNG::Image.from_file(filename1)
  image2 = ChunkyPNG::Image.from_file(filename2)

  output = ChunkyPNG::Image.new(image1.width, image1.height, WHITE)
  diff = []

  each_pixel(image1) do |x, y|
    pixel1 = image1[x,y]
    pixel2 = image2[x,y]
    unless pixel1 == pixel2
      output[x,y], score = color_difference_of_pixels(pixel1, pixel2)
      diff << score
    end
  end

  output.save(output_filename)
end
each_pixel(image) { |x, y| ... } click to toggle source
# File lib/compatriot/image_differ/color_differ.rb, line 74
def self.each_pixel(image)
  image.width.times do |x|
    image.height.times do |y|
      yield(x, y)
    end
  end
end
save_diff_image(output, filename1, filename2) click to toggle source
# File lib/compatriot/image_differ/color_differ.rb, line 47
def self.save_diff_image(output, filename1, filename2)
  path = Compatriot.filepath_for_screenshot('diffs', filename1)
  create_directory_if_necessary(path)
  output.save(path)
end