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