Class: Pxlsrt::Colors
- Inherits:
-
Object
- Object
- Pxlsrt::Colors
- Defined in:
- lib/pxlsrt/colors.rb
Overview
Includes color operations.
Constant Summary collapse
- METHODS =
List of sorting methods.
["sum-rgb", "red", "green", "blue", "sum-hsb", "hue", "saturation", "brightness", "uniqueness", "luma", "random", "cyan", "magenta", "yellow", "alpha", "sum-rgba", "sum-hsba", "none"]
Class Method Summary collapse
-
.arrayToRGBA(a) ⇒ Object
Turns an RGB-like array into ChunkyPNG’s color.
-
.colorAverage(ca, chunky = false) ⇒ Object
Averages an array of RGB-like arrays.
-
.colorDistance(c1, c2, chunky = false) ⇒ Object
Determines color distance from each other using the Pythagorean theorem.
-
.colorUniqueness(c, ca, chunky = false) ⇒ Object
Uses a combination of color averaging and color distance to find how “unique” a color is.
-
.getRGBA(pxl) ⇒ Object
Converts a ChunkyPNG pixel into an array of the red, green, blue, and alpha values.
-
.isPNG?(path) ⇒ Boolean
Check if file is a PNG image.
-
.pixelSort(list, how, reverse) ⇒ Object
Sorts an array of colors based on a method.
Class Method Details
.arrayToRGBA(a) ⇒ Object
Turns an RGB-like array into ChunkyPNG’s color
135 136 137 |
# File 'lib/pxlsrt/colors.rb', line 135 def self.arrayToRGBA(a) return ChunkyPNG::Color.rgba(a[0], a[1], a[2], a[3]) end |
.colorAverage(ca, chunky = false) ⇒ Object
Averages an array of RGB-like arrays.
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/pxlsrt/colors.rb', line 22 def self.colorAverage(ca, chunky = false) if ca.length==1 return ca.first end Pxlsrt::Helpers.verbose(ca) if ca.length == 0 if !chunky r=((ca.collect { |c| c[0] }).inject{ |sum, el| sum+el }).to_f / ca.size g=((ca.collect { |c| c[1] }).inject{ |sum, el| sum+el }).to_f / ca.size b=((ca.collect { |c| c[2] }).inject{ |sum, el| sum+el }).to_f / ca.size a=((ca.collect { |c| c[3] }).inject{ |sum, el| sum+el }).to_f / ca.size return [r.to_i, g.to_i, b.to_i, a.to_i] else r=((ca.collect { |c| ChunkyPNG::Color.r(c) }).inject{ |sum, el| sum+el }).to_f / ca.size g=((ca.collect { |c| ChunkyPNG::Color.g(c) }).inject{ |sum, el| sum+el }).to_f / ca.size b=((ca.collect { |c| ChunkyPNG::Color.b(c) }).inject{ |sum, el| sum+el }).to_f / ca.size a=((ca.collect { |c| ChunkyPNG::Color.a(c) }).inject{ |sum, el| sum+el }).to_f / ca.size return ChunkyPNG::Color.rgba(r.to_i, g.to_i, b.to_i, a.to_i) end end |
.colorDistance(c1, c2, chunky = false) ⇒ Object
Determines color distance from each other using the Pythagorean theorem.
43 44 45 46 47 48 49 |
# File 'lib/pxlsrt/colors.rb', line 43 def self.colorDistance(c1,c2,chunky = false) if !chunky return Math.sqrt((c1[0]-c2[0])**2+(c1[1]-c2[1])**2+(c1[2]-c2[2])**2+(c1[3]-c2[3])**2) else return Math.sqrt((ChunkyPNG::Color.r(c1)-ChunkyPNG::Color.r(c2))**2+(ChunkyPNG::Color.g(c1)-ChunkyPNG::Color.g(c2))**2+(ChunkyPNG::Color.b(c1)-ChunkyPNG::Color.b(c2))**2+(ChunkyPNG::Color.a(c1)-ChunkyPNG::Color.a(c2))**2) end end |
.colorUniqueness(c, ca, chunky = false) ⇒ Object
Uses a combination of color averaging and color distance to find how “unique” a color is.
52 53 54 |
# File 'lib/pxlsrt/colors.rb', line 52 def self.colorUniqueness(c, ca, chunky = false) return Pxlsrt::Colors.colorDistance(c, Pxlsrt::Colors.colorAverage(ca, chunky), chunky) end |
.getRGBA(pxl) ⇒ Object
Converts a ChunkyPNG pixel into an array of the red, green, blue, and alpha values
12 13 14 |
# File 'lib/pxlsrt/colors.rb', line 12 def self.getRGBA(pxl) return [ChunkyPNG::Color.r(pxl), ChunkyPNG::Color.g(pxl), ChunkyPNG::Color.b(pxl), ChunkyPNG::Color.a(pxl)] end |
.isPNG?(path) ⇒ Boolean
Check if file is a PNG image. ChunkyPNG only works with PNG images. Eventually, I might use conversion tools to add support, but not right now.
17 18 19 |
# File 'lib/pxlsrt/colors.rb', line 17 def self.isPNG?(path) return File.open(path, 'rb').read(9).include?('PNG') end |
.pixelSort(list, how, reverse) ⇒ Object
Sorts an array of colors based on a method. Available methods:
-
sum-rgb (default)
-
sum-rgba
-
red
-
yellow
-
green
-
cyan
-
blue
-
magenta
-
hue
-
saturation
-
brightness
-
sum-hsb
-
sum-hsba
-
uniqueness
-
luma
-
random
-
alpha
-
none
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
# File 'lib/pxlsrt/colors.rb', line 76 def self.pixelSort(list, how, reverse) mhm=[] Pxlsrt::Helpers.error(list) if list.length == 0 if reverse == 0 k = 1 elsif reverse == 1 k = -1 else k = [-1, 1].sample end case how.downcase when "sum-rgb" mhm = list.sort_by { |c| k * (ChunkyPNG::Color.r(c)+ChunkyPNG::Color.g(c)+ChunkyPNG::Color.b(c)) } when "sum-rgba" mhm =list.sort_by { |c| k * (ChunkyPNG::Color.r(c)+ChunkyPNG::Color.g(c)+ChunkyPNG::Color.b(c)+ChunkyPNG::Color.a(c)) } when "red" mhm = list.sort_by { |c| k * ChunkyPNG::Color.r(c) } when "yellow" mhm =list.sort_by { |c| k * (ChunkyPNG::Color.r(c)+ChunkyPNG::Color.g(c)) } when "green" mhm = list.sort_by { |c| k * ChunkyPNG::Color.g(c) } when "cyan" mhm =list.sort_by { |c| k * (ChunkyPNG::Color.g(c)+ChunkyPNG::Color.b(c)) } when "blue" mhm = list.sort_by { |c| k * ChunkyPNG::Color.b(c) } when "magenta" mhm =list.sort_by { |c| k * (ChunkyPNG::Color.r(c)+ChunkyPNG::Color.b(c)) } when "hue" mhm = list.sort_by { |c| k * (ChunkyPNG::Color.to_hsb(c)[0] % 360) } when "saturation" mhm = list.sort_by { |c| k * ChunkyPNG::Color.to_hsb(c)[1] } when "brightness" mhm = list.sort_by { |c| k * ChunkyPNG::Color.to_hsb(c)[2] } when "sum-hsb" mhm = list.sort_by { |c| hsb = ChunkyPNG::Color.to_hsb(c); k * ((hsb[0] % 360) / 360.0 + hsb[1] + hsb[2]) } when "sum-hsba" mhm = list.sort_by { |c| hsb = ChunkyPNG::Color.to_hsb(c); k * ((hsb[0] % 360) / 360.0 + hsb[1] + hsb[2] + ChunkyPNG::Color.a(c) / 255.0) } when "uniqueness" avg = Pxlsrt::Colors.colorAverage(list, true) mhm = list.sort_by { |c| k * Pxlsrt::Colors.colorUniqueness(c, [avg], true) } when "luma" mhm = list.sort_by { |c| k * (ChunkyPNG::Color.r(c) * 0.2126 + ChunkyPNG::Color.g(c) * 0.7152 + ChunkyPNG::Color.b(c) * 0.0722 + ChunkyPNG::Color.a(c)) } when "random" mhm = list.shuffle when "alpha" mhm = list.sort_by{ |c| k * ChunkyPNG::Color.a(c) } when "none" if k == -1 mhm = list.reverse else mhm = list end else mhm = list.sort_by { |c| k * (ChunkyPNG::Color.r(c)+ChunkyPNG::Color.g(c)+ChunkyPNG::Color.b(c)) } end return mhm end |