vibrant 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +2 -0
  4. data/CODE_OF_CONDUCT.md +13 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +67 -0
  8. data/Rakefile +1 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +7 -0
  11. data/examples/.gitignore +17 -0
  12. data/examples/Gemfile +18 -0
  13. data/examples/Gemfile.lock +135 -0
  14. data/examples/README.rdoc +28 -0
  15. data/examples/Rakefile +6 -0
  16. data/examples/app/assets/images/.keep +0 -0
  17. data/examples/app/assets/javascripts/application.coffee +1 -0
  18. data/examples/app/assets/javascripts/home.coffee +0 -0
  19. data/examples/app/assets/stylesheets/application.css +15 -0
  20. data/examples/app/assets/stylesheets/home.scss +3 -0
  21. data/examples/app/controllers/application_controller.rb +3 -0
  22. data/examples/app/controllers/concerns/.keep +0 -0
  23. data/examples/app/controllers/home_controller.rb +20 -0
  24. data/examples/app/helpers/application_helper.rb +2 -0
  25. data/examples/app/helpers/home_helper.rb +2 -0
  26. data/examples/app/mailers/.keep +0 -0
  27. data/examples/app/models/.keep +0 -0
  28. data/examples/app/models/concerns/.keep +0 -0
  29. data/examples/app/uploaders/photo_uploader.rb +51 -0
  30. data/examples/app/views/home/index.html.erb +26 -0
  31. data/examples/app/views/layouts/application.html.erb +14 -0
  32. data/examples/bin/bundle +3 -0
  33. data/examples/bin/rails +8 -0
  34. data/examples/bin/rake +8 -0
  35. data/examples/bin/setup +29 -0
  36. data/examples/bin/spring +15 -0
  37. data/examples/config.ru +4 -0
  38. data/examples/config/application.rb +29 -0
  39. data/examples/config/boot.rb +3 -0
  40. data/examples/config/database.yml +25 -0
  41. data/examples/config/environment.rb +5 -0
  42. data/examples/config/environments/development.rb +41 -0
  43. data/examples/config/environments/production.rb +79 -0
  44. data/examples/config/environments/test.rb +42 -0
  45. data/examples/config/initializers/assets.rb +11 -0
  46. data/examples/config/initializers/backtrace_silencers.rb +7 -0
  47. data/examples/config/initializers/cookies_serializer.rb +3 -0
  48. data/examples/config/initializers/filter_parameter_logging.rb +4 -0
  49. data/examples/config/initializers/inflections.rb +16 -0
  50. data/examples/config/initializers/mime_types.rb +4 -0
  51. data/examples/config/initializers/session_store.rb +3 -0
  52. data/examples/config/initializers/wrap_parameters.rb +14 -0
  53. data/examples/config/locales/en.yml +23 -0
  54. data/examples/config/routes.rb +6 -0
  55. data/examples/config/secrets.yml +22 -0
  56. data/examples/db/seeds.rb +7 -0
  57. data/examples/lib/assets/.keep +0 -0
  58. data/examples/lib/tasks/.keep +0 -0
  59. data/examples/log/.keep +0 -0
  60. data/examples/public/1.jpg +0 -0
  61. data/examples/public/2.jpg +0 -0
  62. data/examples/public/3.jpg +0 -0
  63. data/examples/public/4.jpg +0 -0
  64. data/examples/public/404.html +67 -0
  65. data/examples/public/422.html +67 -0
  66. data/examples/public/500.html +66 -0
  67. data/examples/public/favicon.ico +0 -0
  68. data/examples/public/octocat.png +0 -0
  69. data/examples/public/robots.txt +5 -0
  70. data/examples/test/controllers/.keep +0 -0
  71. data/examples/test/controllers/home_controller_test.rb +9 -0
  72. data/examples/test/fixtures/.keep +0 -0
  73. data/examples/test/helpers/.keep +0 -0
  74. data/examples/test/integration/.keep +0 -0
  75. data/examples/test/mailers/.keep +0 -0
  76. data/examples/test/models/.keep +0 -0
  77. data/examples/test/test_helper.rb +10 -0
  78. data/examples/vendor/assets/javascripts/.keep +0 -0
  79. data/examples/vendor/assets/stylesheets/.keep +0 -0
  80. data/images/1.jpg +0 -0
  81. data/images/2.jpg +0 -0
  82. data/images/3.jpg +0 -0
  83. data/images/4.jpg +0 -0
  84. data/images/octocat.png +0 -0
  85. data/lib/vibrant.rb +15 -0
  86. data/lib/vibrant/swatch.rb +55 -0
  87. data/lib/vibrant/version.rb +4 -0
  88. data/lib/vibrant/vibrant.rb +177 -0
  89. data/vibrant-rb.gemspec +25 -0
  90. metadata +174 -0
@@ -0,0 +1,177 @@
1
+ # encoding: utf-8
2
+ module Vibrant
3
+
4
+ class Vibrant
5
+
6
+ TARGET_DARK_LUNA = 0.26
7
+ MAX_DARK_LUNA = 0.45
8
+ MIN_LIGHT_LUNA = 0.55
9
+ TARGET_LIGHT_LUNA = 0.74
10
+
11
+ MIN_NORMAL_LUNA = 0.3
12
+ TARGET_NORMAL_LUNA = 0.5
13
+ MAX_NORMAL_LUNA = 0.7
14
+
15
+ TARGET_MUTED_SATURATION = 0.3
16
+ MAX_MUTED_SATURATION = 0.4
17
+
18
+ TARGET_VIBRANT_SATURATION = 1
19
+ MIN_VIBRANT_SATURATION = 0.35
20
+
21
+ NORMAL_LUNA = {
22
+ target: TARGET_NORMAL_LUNA,
23
+ range: MIN_NORMAL_LUNA..MAX_NORMAL_LUNA
24
+ }
25
+ LIGHT_LUNA = {
26
+ target: TARGET_LIGHT_LUNA,
27
+ range: MIN_LIGHT_LUNA..1
28
+ }
29
+ DARK_LUNA = {
30
+ target: TARGET_DARK_LUNA,
31
+ range: 0..MAX_DARK_LUNA
32
+ }
33
+
34
+ VIBRANT_SATURATION = {
35
+ target: TARGET_VIBRANT_SATURATION,
36
+ range: MIN_VIBRANT_SATURATION..1
37
+ }
38
+ MUTED_SATURATION = {
39
+ target: TARGET_MUTED_SATURATION,
40
+ range: 0..MAX_MUTED_SATURATION
41
+ }
42
+
43
+ WEIGHT_SATURATION = 3
44
+ WEIGHT_LUNA = 6
45
+ WEIGHT_POPULATION = 1
46
+
47
+ @@highestPopulation = 0
48
+
49
+ # def initialize(sourceImage, color_count: 64, quality: 5)
50
+ # @img = Magick::Image.from_blob(sourceImage.read).file.quantize(@color_count)
51
+ # @process
52
+ # end
53
+
54
+ def initialize(sourceImage, color_count: 64, quality: 5)
55
+ @color_count = color_count
56
+ @quality = quality
57
+ @image = Magick::Image.read(sourceImage).first.quantize(@color_count)
58
+ process
59
+ end
60
+
61
+ def process
62
+
63
+ @_swatches = []
64
+
65
+ # histogram
66
+ histogram = @image.color_histogram.inject({}) { |h, pair|
67
+ hex = pair[0].to_color(Magick::AllCompliance, false, 8, true)
68
+ hsla = pair[0].to_hsla
69
+ count = pair[1]
70
+
71
+ h[hex] ||= {
72
+ hex: hex,
73
+ hsla: hsla,
74
+ count: 0
75
+ }
76
+ h[hex][:count] += count
77
+ h
78
+ }.each_pair { |key, val|
79
+ @_swatches.push(Swatch.new(val[:hex], val[:hsla], val[:count]))
80
+ }
81
+
82
+ @maxPopulation = @_swatches.collect(&:population).max
83
+
84
+ @vibrantSwatch = find_color_variation(NORMAL_LUNA, VIBRANT_SATURATION)
85
+ @lightVibrantSwatch = find_color_variation(LIGHT_LUNA, VIBRANT_SATURATION)
86
+ @darkVibrantSwatch = find_color_variation(DARK_LUNA, VIBRANT_SATURATION)
87
+ @mutedSwatch = find_color_variation(NORMAL_LUNA, MUTED_SATURATION)
88
+ @lightMutedSwatch = find_color_variation(LIGHT_LUNA, MUTED_SATURATION)
89
+ @darkMutedSwatch = find_color_variation(DARK_LUNA, MUTED_SATURATION)
90
+
91
+ if @vibrantSwatch.nil? && !@darkVibrantSwatch.nil?
92
+ hsla = @DarkVibrantSwatch.hsla.dup
93
+ hsla[2] = TARGET_NORMAL_LUNA
94
+ @vibrantSwatch = Swatch.new(@DarkVibrantSwatch.hex, hsla, 0)
95
+ end
96
+
97
+ if @darkVibrantSwatch.nil? && !@vibrantSwatch.nil?
98
+ hsla = @vibrantSwatch.hsla.dup
99
+ hsla[2] = TARGET_DARK_LUNA
100
+ @darkVibrantSwatch = Swatch.new(@vibrantSwatch.hex, hsla, 0)
101
+ end
102
+
103
+ end
104
+
105
+ def find_color_variation(luna, saturation)
106
+ max = nil
107
+ maxValue = 0
108
+
109
+ @_swatches.each do |swatch|
110
+ #h = swatch.hsla[0] / 360
111
+ s = swatch.hsla[1] / 255
112
+ l = swatch.hsla[2] / 255
113
+
114
+ if luna[:range].include?(l) && saturation[:range].include?(s) && !already_selected?(swatch)
115
+
116
+ value = create_comparison_value(s, saturation[:target], l, luna[:target], swatch.population, @maxPopulation)
117
+ if max.nil? || value > maxValue
118
+ max = swatch
119
+ maxValue = value
120
+ end
121
+ end
122
+ end
123
+ p max
124
+
125
+ max
126
+ end
127
+
128
+ def create_comparison_value(saturation, targetSaturation, luna, target_luna, population, max_population)
129
+ self.class.weightedMean([
130
+ [self.class.invert_diff(saturation, targetSaturation), WEIGHT_SATURATION],
131
+ [self.class.invert_diff(luna, target_luna), WEIGHT_LUNA],
132
+ [(population / max_population), WEIGHT_POPULATION]
133
+ ])
134
+ end
135
+
136
+
137
+ def swatches
138
+ Swatches.new(
139
+ vibrant: @vibrantSwatch,
140
+ muted: @mutedSwatch,
141
+ dark_vibrant: @darkVibrantSwatch,
142
+ dark_muted: @darkMutedSwatch,
143
+ light_vibrant: @lightVibrantSwatch,
144
+ light_muted: @lightMutedSwatch
145
+ )
146
+ end
147
+
148
+ def already_selected?(swatch)
149
+ return @vibrantSwatch == swatch ||
150
+ @darkVibrantSwatch == swatch ||
151
+ @lightVibrantSwatch == swatch ||
152
+ @mutedSwatch == swatch ||
153
+ @darkMutedSwatch == swatch ||
154
+ @lightMutedSwatch == swatch
155
+ end
156
+
157
+ class << self
158
+
159
+ def invert_diff(value, targetValue)
160
+ 1 - (value - targetValue).abs
161
+ end
162
+
163
+ def weightedMean(values)
164
+ sum = 0
165
+ sumWeight = 0
166
+ values.each do |v|
167
+ value = v[0]
168
+ weight = v[1]
169
+ sum += value * weight
170
+ sumWeight += weight
171
+ end
172
+ sum / sumWeight
173
+ end
174
+ end
175
+
176
+ end
177
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'vibrant/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "vibrant"
8
+ spec.version = Vibrant::VERSION
9
+ spec.authors = ["dondoco7"]
10
+ spec.email = ["dondoco7@gmail.com"]
11
+
12
+ spec.summary = %q{Get color variations from an image.}
13
+ spec.description = %q{Get color variations from an image. Original is 'http://jariz.github.io/vibrant.js'}
14
+ spec.homepage = "https://github.com/dondoco7/vibrant-rb/"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_dependency "rmagick", ">= 2.14"
23
+ spec.add_development_dependency "bundler", "~> 1.10"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ end
metadata ADDED
@@ -0,0 +1,174 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vibrant
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - dondoco7
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-11-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rmagick
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '2.14'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '2.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.10'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.10'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ description: Get color variations from an image. Original is 'http://jariz.github.io/vibrant.js'
56
+ email:
57
+ - dondoco7@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - ".rspec"
64
+ - CODE_OF_CONDUCT.md
65
+ - Gemfile
66
+ - LICENSE.txt
67
+ - README.md
68
+ - Rakefile
69
+ - bin/console
70
+ - bin/setup
71
+ - examples/.gitignore
72
+ - examples/Gemfile
73
+ - examples/Gemfile.lock
74
+ - examples/README.rdoc
75
+ - examples/Rakefile
76
+ - examples/app/assets/images/.keep
77
+ - examples/app/assets/javascripts/application.coffee
78
+ - examples/app/assets/javascripts/home.coffee
79
+ - examples/app/assets/stylesheets/application.css
80
+ - examples/app/assets/stylesheets/home.scss
81
+ - examples/app/controllers/application_controller.rb
82
+ - examples/app/controllers/concerns/.keep
83
+ - examples/app/controllers/home_controller.rb
84
+ - examples/app/helpers/application_helper.rb
85
+ - examples/app/helpers/home_helper.rb
86
+ - examples/app/mailers/.keep
87
+ - examples/app/models/.keep
88
+ - examples/app/models/concerns/.keep
89
+ - examples/app/uploaders/photo_uploader.rb
90
+ - examples/app/views/home/index.html.erb
91
+ - examples/app/views/layouts/application.html.erb
92
+ - examples/bin/bundle
93
+ - examples/bin/rails
94
+ - examples/bin/rake
95
+ - examples/bin/setup
96
+ - examples/bin/spring
97
+ - examples/config.ru
98
+ - examples/config/application.rb
99
+ - examples/config/boot.rb
100
+ - examples/config/database.yml
101
+ - examples/config/environment.rb
102
+ - examples/config/environments/development.rb
103
+ - examples/config/environments/production.rb
104
+ - examples/config/environments/test.rb
105
+ - examples/config/initializers/assets.rb
106
+ - examples/config/initializers/backtrace_silencers.rb
107
+ - examples/config/initializers/cookies_serializer.rb
108
+ - examples/config/initializers/filter_parameter_logging.rb
109
+ - examples/config/initializers/inflections.rb
110
+ - examples/config/initializers/mime_types.rb
111
+ - examples/config/initializers/session_store.rb
112
+ - examples/config/initializers/wrap_parameters.rb
113
+ - examples/config/locales/en.yml
114
+ - examples/config/routes.rb
115
+ - examples/config/secrets.yml
116
+ - examples/db/seeds.rb
117
+ - examples/lib/assets/.keep
118
+ - examples/lib/tasks/.keep
119
+ - examples/log/.keep
120
+ - examples/public/1.jpg
121
+ - examples/public/2.jpg
122
+ - examples/public/3.jpg
123
+ - examples/public/4.jpg
124
+ - examples/public/404.html
125
+ - examples/public/422.html
126
+ - examples/public/500.html
127
+ - examples/public/favicon.ico
128
+ - examples/public/octocat.png
129
+ - examples/public/robots.txt
130
+ - examples/test/controllers/.keep
131
+ - examples/test/controllers/home_controller_test.rb
132
+ - examples/test/fixtures/.keep
133
+ - examples/test/helpers/.keep
134
+ - examples/test/integration/.keep
135
+ - examples/test/mailers/.keep
136
+ - examples/test/models/.keep
137
+ - examples/test/test_helper.rb
138
+ - examples/vendor/assets/javascripts/.keep
139
+ - examples/vendor/assets/stylesheets/.keep
140
+ - images/1.jpg
141
+ - images/2.jpg
142
+ - images/3.jpg
143
+ - images/4.jpg
144
+ - images/octocat.png
145
+ - lib/vibrant.rb
146
+ - lib/vibrant/swatch.rb
147
+ - lib/vibrant/version.rb
148
+ - lib/vibrant/vibrant.rb
149
+ - vibrant-rb.gemspec
150
+ homepage: https://github.com/dondoco7/vibrant-rb/
151
+ licenses:
152
+ - MIT
153
+ metadata: {}
154
+ post_install_message:
155
+ rdoc_options: []
156
+ require_paths:
157
+ - lib
158
+ required_ruby_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ required_rubygems_version: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ requirements: []
169
+ rubyforge_project:
170
+ rubygems_version: 2.4.5
171
+ signing_key:
172
+ specification_version: 4
173
+ summary: Get color variations from an image.
174
+ test_files: []