class AutoColors::Color
cs.haifa.ac.il/hagit/courses/ist/Lectures/Demos/ColorApplet2/t_convert.html en.wikipedia.org/wiki/Lab_color_space
Attributes
rgb_approx[R]
Public Class Methods
new(lab,rgb=nil)
click to toggle source
# File lib/autocolors/color.rb, line 12 def initialize(lab,rgb=nil) if rgb.nil? @cl,@ca,@cb = lab.map{|v| v.to_f} @lab_dirty = true @rgb_dirty = false else @r,@g,@b = rgb.map{|v| v.to_f} @lab_dirty = false @rgb_dirty = true end end
Public Instance Methods
-(c)
click to toggle source
# File lib/autocolors/color.rb, line 94 def -(c) if c.is_a?(Color) # Euclidean distance in 3 dimensions, but emphasize brightness a bit # more than the color (which is more how the human eye works) Math.sqrt((cl*2.5 - c.cl*2.5)**2 + (ca - c.ca)**2 + (cb - c.cb)**2) end end
b()
click to toggle source
# File lib/autocolors/color.rb, line 46 def b; lab_propagate if @lab_dirty; @b end
b=(v)
click to toggle source
# File lib/autocolors/color.rb, line 50 def b=(v) @rgb_dirty=true; @b=v.to_f end
ca()
click to toggle source
# File lib/autocolors/color.rb, line 35 def ca; rgb_propagate if @rgb_dirty; @ca end
ca=(v)
click to toggle source
# File lib/autocolors/color.rb, line 39 def ca=(v) @lab_dirty=true; @ca=v.to_f end
cb()
click to toggle source
# File lib/autocolors/color.rb, line 36 def cb; rgb_propagate if @rgb_dirty; @cb end
cb=(v)
click to toggle source
# File lib/autocolors/color.rb, line 40 def cb=(v) @lab_dirty=true; @cb=v.to_f end
chroma()
click to toggle source
# File lib/autocolors/color.rb, line 54 def chroma; Math::sqrt((ca * ca) + (cb * cb)) end
chroma=(v)
click to toggle source
# File lib/autocolors/color.rb, line 83 def chroma=(v) q = Math.atan2(ca, cb) v = v.to_f self.ca = Math::sin(q) * v self.cb = Math::cos(q) * v end
cl()
click to toggle source
# File lib/autocolors/color.rb, line 34 def cl; rgb_propagate if @rgb_dirty; @cl end
cl=(v)
click to toggle source
# File lib/autocolors/color.rb, line 38 def cl=(v) @lab_dirty=true; @cl=v.to_f end
g()
click to toggle source
# File lib/autocolors/color.rb, line 45 def g; lab_propagate if @lab_dirty; @g end
g=(v)
click to toggle source
# File lib/autocolors/color.rb, line 49 def g=(v) @rgb_dirty=true; @g=v.to_f end
hue()
click to toggle source
Hue & chroma
# File lib/autocolors/color.rb, line 53 def hue; rad2turns(Math.atan2(ca, cb)) end
hue=(v)
click to toggle source
# File lib/autocolors/color.rb, line 76 def hue=(v) r = turns2rad(v.to_f) c = chroma self.ca = Math::sin(r) * c self.cb = Math::cos(r) * c end
hue_index=(v)
click to toggle source
# File lib/autocolors/color.rb, line 56 def hue_index=(v) self.hue = [ 0.0, # 0 | Blue 0.15, # 1 | Cyan 0.225, # 2 | Teal 0.33, # 3 | Green 0.4, # 4 | Forest green 0.45, # 5 | Puke green 0.5, # 6 | Yellow 0.565, # 7 | Orange 0.625, # 8 | Orange-red 0.6575, # 9 | Red 0.75, # 10 | Magenta 0.825, # 11 | Fuchsia 0.8875, # 12 | Pink 0.925, # 13 | Violet 0.95 # 14 | Indigo ][v.to_i] end
lab()
click to toggle source
CIELAB colorspace
# File lib/autocolors/color.rb, line 33 def lab; rgb_propagate if @rgb_dirty; [@cl,@ca,@cb] end
lab=(v)
click to toggle source
# File lib/autocolors/color.rb, line 37 def lab=(v) @lab_dirty=true; @cl,@ca,@cb=v.map{|a|a.to_f} end
lb()
click to toggle source
# File lib/autocolors/color.rb, line 27 def lb; rgb_propagate if @rgb_dirty; lab_propagate if @lab_dirty; @lb end
lg()
click to toggle source
# File lib/autocolors/color.rb, line 26 def lg; rgb_propagate if @rgb_dirty; lab_propagate if @lab_dirty; @lg end
lr()
click to toggle source
Intermediate spaces
# File lib/autocolors/color.rb, line 25 def lr; rgb_propagate if @rgb_dirty; lab_propagate if @lab_dirty; @lr end
r()
click to toggle source
# File lib/autocolors/color.rb, line 44 def r; lab_propagate if @lab_dirty; @r end
r=(v)
click to toggle source
# File lib/autocolors/color.rb, line 48 def r=(v) @rgb_dirty=true; @r=v.to_f end
rgb()
click to toggle source
RGB colorspace
# File lib/autocolors/color.rb, line 43 def rgb; lab_propagate if @lab_dirty; [@r,@g,@b] end
rgb=(v)
click to toggle source
# File lib/autocolors/color.rb, line 47 def rgb=(v) @rgb_dirty=true; @r,@g,@b=v.map{|a|a.to_f} end
s_cterm()
click to toggle source
# File lib/autocolors/color.rb, line 192 def s_cterm 'NONE' end
s_high()
click to toggle source
# File lib/autocolors/color.rb, line 196 def s_high 'NONE' end
s_lcterm()
click to toggle source
# File lib/autocolors/color.rb, line 188 def s_lcterm 'NONE' end
s_term()
click to toggle source
# File lib/autocolors/color.rb, line 184 def s_term 'NONE' end
to_16()
click to toggle source
# File lib/autocolors/color.rb, line 180 def to_16 CUBE256[0..15].each_with_index.map{|c,i| [i,c-self]}.sort_by{|i,diff| diff}.first[0] end
to_256()
click to toggle source
# File lib/autocolors/color.rb, line 175 def to_256 CUBE256.each_with_index.map{|c,i| [i,c-self]}.sort_by{|i,diff| diff}.first[0] #CUBE256.sort_by{|c| c - self}.first end
to_s()
click to toggle source
# File lib/autocolors/color.rb, line 90 def to_s '#' + rgb.map{|v|v.to_s(16).rjust(2,'0')}.join('') end
x()
click to toggle source
# File lib/autocolors/color.rb, line 28 def x; rgb_propagate if @rgb_dirty; lab_propagate if @lab_dirty; @x end
y()
click to toggle source
# File lib/autocolors/color.rb, line 29 def y; rgb_propagate if @rgb_dirty; lab_propagate if @lab_dirty; @y end
z()
click to toggle source
# File lib/autocolors/color.rb, line 30 def z; rgb_propagate if @rgb_dirty; lab_propagate if @lab_dirty; @z end
Protected Instance Methods
lab_propagate()
click to toggle source
# File lib/autocolors/color.rb, line 113 def lab_propagate p = (@cl + 16.0) / 116.0 @x = (p + @ca / 500.0) ** 3.0 @y = p ** 3.0 @z = (p - @cb / 200.0) ** 3.0 @lr,@lg,@lb = (XYZ2LRGB*Matrix[[@x],[@y],[@z]]).to_a.flatten @rgb_approx = false @r,@g,@b = [@lr,@lg,@lb].map{|c|lrgbc_to_rgbc(c)} @lab_dirty = false end
labf(t)
click to toggle source
# File lib/autocolors/color.rb, line 124 def labf(t) t > 0.008856 ? t**(1.0/3.0) : 7.787 * t + (16.0/116.0) end
lrgbc_to_rgbc(c)
click to toggle source
# File lib/autocolors/color.rb, line 135 def lrgbc_to_rgbc(c) if c <= 0.0031308 then v = (12.92 * c * 255.0).round else v = ((1.055 * (c ** (1.0/2.4)) - 0.055) * 255.0).round end if v < 0 then @rgb_approx = true; 0 elsif v > 255 then @rgb_approx = true; 255 else v end end
rad2turns(r)
click to toggle source
# File lib/autocolors/color.rb, line 143 def rad2turns(r) (r + Math::PI) / (2.0 * Math::PI) end
rgb_propagate()
click to toggle source
# File lib/autocolors/color.rb, line 104 def rgb_propagate @lr,@lg,@lb = [@r,@g,@b].map{|c|rgbc_to_lrgbc(c)} @x,@y,@z = (LRGB2XYZ*Matrix[[@lr],[@lg],[@lb]]).to_a.flatten @cl = (@y > 0.008856) ? 116.0*(@y ** (1.0/3.0)) - 16.0 : 903.3 * @y @ca = 500.0 * (labf(@x) - labf(@y)) @cb = 200.0 * (labf(@y) - labf(@z)) @rgb_dirty = false end
rgbc_to_lrgbc(c)
click to toggle source
en.wikipedia.org/wiki/SRGB_color_space
# File lib/autocolors/color.rb, line 129 def rgbc_to_lrgbc(c) cf = c.to_f / 255.0 if cf <= 0.04045 then cf / 12.92 else ((cf + 0.055) / 1.055) ** 2.4 end end
turns2rad(t)
click to toggle source
# File lib/autocolors/color.rb, line 144 def turns2rad(t) (t * 2.0 * Math::PI) - Math::PI end