chromatism
Version:
A simple set of utility functions for colours.
48 lines (37 loc) • 1.14 kB
JavaScript
import getIlluminant from '../helpers/get-illuminant'
import toDegree from '../helpers/to-degree'
export default {
XYZ: value => {
const epsilon = 0.008856
const kappa = 903.3
const white = getIlluminant('D65')
const chromeCoordsU = (c) => (c.X * 4) / (c.X + (15 * c.Y) + (3 * c.Z))
const chromeCoordsV = (c) => (c.Y * 9) / (c.X + (15 * c.Y) + (3 * c.Z))
const u0 = chromeCoordsU(white)
const v0 = chromeCoordsV(white)
const a = (1 / 3) * (((52 * value.L) / (value.u + ((13 * value.L) * u0))) - 1)
const Y = value.L > (kappa * epsilon) ? (Math.pow(((value.L + 16) / 116), 3)) : value.L / kappa
const b = -5 * Y
const d = Y * (((39 * value.L) / (value.v + ((13 * value.L) * v0))) - 5)
const X = (d - b) / (a - (-1 / 3))
const Z = (X * a) + b
return {
X: X * 100,
Y: Y * 100,
Z: Z * 100
}
},
cielch: value => {
const C = Math.sqrt(Math.pow(value.u, 2) + Math.pow(value.v, 2))
let h = Math.atan2(value.v, value.u)
if (h < 0) {
h += (2 * Math.PI)
}
h = toDegree(h)
return {
L: value.L,
C,
h
}
}
}