def self.from_rgb_triple(rgb_triple)
r, g, b = normalize_rgb_triple rgb_triple
x = 0.436052025 * r + 0.385081593 * g + 0.143087414 * b
y = 0.222491598 * r + 0.71688606 * g + 0.060621486 * b
z = 0.013929122 * r + 0.097097002 * g + 0.71418547 * b
xr = x / 0.964221
yr = y
zr = z / 0.825211
eps = 216.0 / 24389
k = 24389.0 / 27
fx = xr > eps ? xr ** (1.0 / 3) : (k * xr + 16) / 116
fy = yr > eps ? yr ** (1.0 / 3) : (k * yr + 16) / 116
fz = zr > eps ? zr ** (1.0 / 3) : (k * zr + 16) / 116
l = 2.55 * ((116 * fy) - 16)
a = 500 * (fx - fy)
b = 200 * (fy - fz)
new(l.round, a.round, b.round)
end