Module: Chromate::RGB

Defined in:
lib/chromate/rgb.rb

Constant Summary collapse

COLORS =

RGB array representations of the 256 xterm colors

[
  [  0,   0,   0], [128,   0,   0], [  0, 128,   0], [128, 128,   0],
  [  0,   0, 128], [128,   0, 128], [  0, 128, 128], [192, 192, 192],
  [128, 128, 128], [255,   0,   0], [  0, 255,   0], [255, 255,   0],
  [  0,   0, 255], [255,   0, 255], [  0, 255, 255], [255, 255, 255],
  [  0,   0,   0], [  0,   0,  95], [  0,   0, 135], [  0,   0, 175],
  [  0,   0, 215], [  0,   0, 255], [  0,  95,   0], [  0,  95,  95],
  [  0,  95, 135], [  0,  95, 175], [  0,  95, 215], [  0,  95, 255],
  [  0, 135,   0], [  0, 135,  95], [  0, 135, 135], [  0, 135, 175],
  [  0, 135, 215], [  0, 135, 255], [  0, 175,   0], [  0, 175,  95],
  [  0, 175, 135], [  0, 175, 175], [  0, 175, 215], [  0, 175, 255],
  [  0, 215,   0], [  0, 215,  95], [  0, 215, 135], [  0, 215, 175],
  [  0, 215, 215], [  0, 215, 255], [  0, 255,   0], [  0, 255,  95],
  [  0, 255, 135], [  0, 255, 175], [  0, 255, 215], [  0, 255, 255],
  [ 95,   0,   0], [ 95,   0,  95], [ 95,   0, 135], [ 95,   0, 175],
  [ 95,   0, 215], [ 95,   0, 255], [ 95,  95,   0], [ 95,  95,  95],
  [ 95,  95, 135], [ 95,  95, 175], [ 95,  95, 215], [ 95,  95, 255],
  [ 95, 135,   0], [ 95, 135,  95], [ 95, 135, 135], [ 95, 135, 175],
  [ 95, 135, 215], [ 95, 135, 255], [ 95, 175,   0], [ 95, 175,  95],
  [ 95, 175, 135], [ 95, 175, 175], [ 95, 175, 215], [ 95, 175, 255],
  [ 95, 215,   0], [ 95, 215,  95], [ 95, 215, 135], [ 95, 215, 175],
  [ 95, 215, 215], [ 95, 215, 255], [ 95, 255,   0], [ 95, 255,  95],
  [ 95, 255, 135], [ 95, 255, 175], [ 95, 255, 215], [ 95, 255, 255],
  [135,   0,   0], [135,   0,  95], [135,   0, 135], [135,   0, 175],
  [135,   0, 215], [135,   0, 255], [135,  95,   0], [135,  95,  95],
  [135,  95, 135], [135,  95, 175], [135,  95, 215], [135,  95, 255],
  [135, 135,   0], [135, 135,  95], [135, 135, 135], [135, 135, 175],
  [135, 135, 215], [135, 135, 255], [135, 175,   0], [135, 175,  95],
  [135, 175, 135], [135, 175, 175], [135, 175, 215], [135, 175, 255],
  [135, 215,   0], [135, 215,  95], [135, 215, 135], [135, 215, 175],
  [135, 215, 215], [135, 215, 255], [135, 255,   0], [135, 255,  95],
  [135, 255, 135], [135, 255, 175], [135, 255, 215], [135, 255, 255],
  [175,   0,   0], [175,   0,  95], [175,   0, 135], [175,   0, 175],
  [175,   0, 215], [175,   0, 255], [175,  95,   0], [175,  95,  95],
  [175,  95, 135], [175,  95, 175], [175,  95, 215], [175,  95, 255],
  [175, 135,   0], [175, 135,  95], [175, 135, 135], [175, 135, 175],
  [175, 135, 215], [175, 135, 255], [175, 175,   0], [175, 175,  95],
  [175, 175, 135], [175, 175, 175], [175, 175, 215], [175, 175, 255],
  [175, 215,   0], [175, 215,  95], [175, 215, 135], [175, 215, 175],
  [175, 215, 215], [175, 215, 255], [175, 255,   0], [175, 255,  95],
  [175, 255, 135], [175, 255, 175], [175, 255, 215], [175, 255, 255],
  [215,   0,   0], [215,   0,  95], [215,   0, 135], [215,   0, 175],
  [215,   0, 215], [215,   0, 255], [215,  95,   0], [215,  95,  95],
  [215,  95, 135], [215,  95, 175], [215,  95, 215], [215,  95, 255],
  [215, 135,   0], [215, 135,  95], [215, 135, 135], [215, 135, 175],
  [215, 135, 215], [215, 135, 255], [223, 175,   0], [223, 175,  95],
  [223, 175, 135], [223, 175, 175], [223, 175, 223], [223, 175, 255],
  [223, 223,   0], [223, 223,  95], [223, 223, 135], [223, 223, 175],
  [223, 223, 223], [223, 223, 255], [223, 255,   0], [223, 255,  95],
  [223, 255, 135], [223, 255, 175], [223, 255, 223], [223, 255, 255],
  [255,   0,   0], [255,   0,  95], [255,   0, 135], [255,   0, 175],
  [255,   0, 223], [255,   0, 255], [255,  95,   0], [255,  95,  95],
  [255,  95, 135], [255,  95, 175], [255,  95, 223], [255,  95, 255],
  [255, 135,   0], [255, 135,  95], [255, 135, 135], [255, 135, 175],
  [255, 135, 223], [255, 135, 255], [255, 175,   0], [255, 175,  95],
  [255, 175, 135], [255, 175, 175], [255, 175, 223], [255, 175, 255],
  [255, 223,   0], [255, 223,  95], [255, 223, 135], [255, 223, 175],
  [255, 223, 223], [255, 223, 255], [255, 255,   0], [255, 255,  95],
  [255, 255, 135], [255, 255, 175], [255, 255, 223], [255, 255, 255],
  [  8,   8,   8], [ 18,  18,  18], [ 28,  28,  28], [ 38,  38,  38],
  [ 48,  48,  48], [ 58,  58,  58], [ 68,  68,  68], [ 78,  78,  78],
  [ 88,  88,  88], [ 98,  98,  98], [108, 108, 108], [118, 118, 118],
  [128, 128, 128], [138, 138, 138], [148, 148, 148], [158, 158, 158],
  [168, 168, 168], [178, 178, 178], [188, 188, 188], [198, 198, 198],
  [208, 208, 208], [218, 218, 218], [228, 228, 228], [238, 238, 238]
]
CONVERSION_MATRIX =

D65 conversion matrix

RX =

CIE D65 standard illuminant

95.047
RY =
100.0
RZ =
108.883

Class Method Summary collapse

Class Method Details

.to_lab(rgb) ⇒ <Integer>

Convert an RGB array into an array representing coordinates in L*a*b* color space.

Parameters:

  • rgb (<Integer>)

    an RGB array

Returns:

  • (<Integer>)

    a L*a*b* array



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/chromate/rgb.rb', line 93

def self.to_lab(rgb)
  xyz_matrix = CONVERSION_MATRIX * Matrix[*rgb.map do |c|
    c = c / 255.0
    if c > 0.04045
      [(c + 0.055 / 1.055) ** 2.4]
    else
      [c / 12.92]
    end
  end]
  f_x, f_y, f_z = *[
    xyz_matrix[0, 0] / RX,
    xyz_matrix[1, 0] / RY,
    xyz_matrix[2, 0] / RZ
  ].map do |c|
    if c > 0.008856
      Math.cbrt(c)
    else
      (903.3 * c + 16) / 116
    end
  end
  [116 * f_y - 16, 500 * (f_x - f_y), 200 * (f_y - f_z)]
end