Class: Compatriot::ColorDiffer

Inherits:
Object
  • Object
show all
Defined in:
lib/compatriot/image_differ/color_differ.rb

Class Method Summary collapse

Class Method Details

.color_difference_of_pixels(pixel1, pixel2) ⇒ Object



58
59
60
61
62
63
64
65
66
# 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) ⇒ Object

Not called anywhere



69
70
71
72
# 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) ⇒ Object



53
54
55
56
# 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) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 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) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 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) ⇒ Object



74
75
76
77
78
79
80
# 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) ⇒ Object



47
48
49
50
51
# 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