color_matcher 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 11c17e7cf33220d83cfbf69c356cfa4efd80f3e1
4
+ data.tar.gz: 25f6955f0d58b576542c2012a84e5d2d10d2b994
5
+ SHA512:
6
+ metadata.gz: 7a8307d61802d15299ad07b3af38f27c8cf1aac62c79f4c01502fb5161cd0e6c57d549ce254eb4ebadbd7ff1f580eabbb607a72a9b3f97e3d4b988f72d2466eb
7
+ data.tar.gz: 80c81affa292a4033b3dfcf9a1cc157278d64a4721abb075b243175191dd8824ffb72bfed572db75ffea109e841c5e9cf3ac125a96a1e656e4d567abf7f97215
data/README.md ADDED
@@ -0,0 +1,32 @@
1
+ ColorMatcher
2
+ ======
3
+
4
+ [![Build Status](https://img.shields.io/travis/chicisimo/color_matcher/master.svg)](https://travis-ci.org/chicisimo/color_matcher)
5
+
6
+ ColorMatcher it's a gem that given a color, returns the nearest one from a collection.
7
+
8
+ ## Usage
9
+
10
+ You should read the [tests](https://github.com/chicisimo/color_matcher/blob/master/spec/color_matcher_spec.rb) as they are the most updated documentation.
11
+
12
+ There's only one method:
13
+
14
+ ```ruby
15
+ ColorMatcher.closest_color("000000", ["000000", "ffffff"]) # => 000000
16
+ ```
17
+
18
+ ## How do we use it at Chicisimo
19
+
20
+ We use the color matcher at Chicisimo to match our looks with the color picked using the slider in our discover section:
21
+
22
+ <p align="center">
23
+ <img src="doc/discover.png" width="200">
24
+ </p>
25
+
26
+ ## Algorithm
27
+
28
+ We are using the Euclidean distance algorithm as described [here](http://www.compuphase.com/cmetric.htm).
29
+
30
+ ## License
31
+
32
+ ColorMatcher is open-sourced software licensed under the MIT license.
@@ -0,0 +1,45 @@
1
+ module ColorMatcher
2
+ extend self
3
+
4
+ Match = Struct.new(:color, :proximity)
5
+
6
+ def closest_color(color, collection)
7
+ return if color.empty? || collection.empty?
8
+
9
+ matches = collection.map do |collection_color|
10
+ Match.new(collection_color, proximity_of(color, collection_color))
11
+ end
12
+
13
+ matches.min_by(&:proximity).color
14
+ end
15
+
16
+ def proximity_of(color, another_color)
17
+ color_red, color_green, color_blue = split_color(color)
18
+ another_color_red, another_color_green, another_color_blue = split_color(another_color)
19
+
20
+ color_red_mean = (color_red + another_color_red) / 2
21
+ color_red_gap = color_red - another_color_red
22
+ color_green_gap = color_green - another_color_green
23
+ color_blue_gap = color_blue - another_color_blue
24
+
25
+ euclidean_distance(color_red_mean, color_red_gap, color_green_gap, color_blue_gap)
26
+ end
27
+
28
+ def split_color(color)
29
+ red = (color[0] + color[1]).to_i(16)
30
+ green = (color[2] + color[3]).to_i(16)
31
+ blue = (color[4] + color[5]).to_i(16)
32
+
33
+ [red, green, blue]
34
+ end
35
+
36
+ def euclidean_distance(red_mean, red_gap, green_gap, blue_gap)
37
+ red_weight = ((512 + red_mean) * red_gap ** 2) >> 8
38
+ green_weight = 4 * green_gap ** 2
39
+ blue_weight = ((767 - red_mean) * blue_gap ** 2) >> 8
40
+
41
+ Math.sqrt(red_weight + green_weight + blue_weight);
42
+ end
43
+
44
+ private_class_method :proximity_of, :split_color, :euclidean_distance
45
+ end
@@ -0,0 +1,32 @@
1
+ require "color_matcher"
2
+
3
+ describe ColorMatcher do
4
+ it "matches an exact hex color" do
5
+ match = ColorMatcher.closest_color("000000", ["000000", "000001"])
6
+ expect(match).to eq("000000")
7
+ end
8
+
9
+ it "matches to the closest color" do
10
+ match = ColorMatcher.closest_color("fffff1", ["000001", "000002", "ffffff"])
11
+ expect(match).to eq("ffffff")
12
+
13
+ match = ColorMatcher.closest_color("000000", ["ffffff"])
14
+ expect(match).to eq("ffffff")
15
+
16
+ match = ColorMatcher.closest_color("fe0e00", ["33cc00", "fe0000"])
17
+ expect(match).to eq("fe0000")
18
+
19
+ match = ColorMatcher.closest_color("cdf200", ["33cc00", "867f86"])
20
+ expect(match).to eq("33cc00")
21
+ end
22
+
23
+ it "returns nil when an empty collection is given" do
24
+ match = ColorMatcher.closest_color("cdf200", [])
25
+ expect(match).to be_nil
26
+ end
27
+
28
+ it "returns nil when an empty color is given" do
29
+ match = ColorMatcher.closest_color("", ["000000", "ffffff"])
30
+ expect(match).to be_nil
31
+ end
32
+ end
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: color_matcher
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Pedro Gimenez
8
+ - Juan Guerrero
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-04-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ description: Matches the nearest HEX color in a collection given a color
29
+ email:
30
+ - pedro@chicisimo.com
31
+ - juan@chicisimo.com
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files:
35
+ - README.md
36
+ files:
37
+ - lib/color_matcher.rb
38
+ - spec/color_matcher_spec.rb
39
+ - README.md
40
+ homepage: http://github.com/chicisimo/color_matcher
41
+ licenses:
42
+ - MIT
43
+ metadata: {}
44
+ post_install_message:
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 2.1.0
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ requirements: []
59
+ rubyforge_project:
60
+ rubygems_version: 2.0.14
61
+ signing_key:
62
+ specification_version: 4
63
+ summary: Matches the nearest HEX color in a collection given a color
64
+ test_files: []