|
|
RGB to LAB
//RGB2Lab
//https://blog.csdn.net/leansmall/article/details/79569519
let array3 = color.toArray();
let r = array3[0];//[0,1]
let g = array3[1];//[0,1]
let b = array3[2];//[0,1]
// gamma 2.2
if (r > 0.04045){
r = Math.pow((r + 0.055) / 1.055, 2.4);
}else{
r = r / 12.92;
}
if (g > 0.04045){
g = Math.pow((g + 0.055) / 1.055, 2.4);
}else{
g = g / 12.92;
}
if (b > 0.04045){
b = Math.pow((b + 0.055) / 1.055, 2.4);
}else{
b = b / 12.92;
}
// sRGB
let X = r * 0.436052025 + g * 0.385081593 + b * 0.143087414;
let Y = r * 0.222491598 + g * 0.716886060 + b * 0.060621486;
let Z = r * 0.013929122 + g * 0.097097002 + b * 0.714185470;
// XYZ range: 0~100
X = X * 100.000;
Y = Y * 100.000;
Z = Z * 100.000;
// Reference White Point
let ref_X = 96.4221;
let ref_Y = 100.000;
let ref_Z = 82.5211;
X = X / ref_X;
Y = Y / ref_Y;
Z = Z / ref_Z;
// Lab
if (X > 0.008856){
X = Math.pow(X, 1 / 3.000);
}else{
X = (7.787 * X) + (16 / 116.000);
}
if (Y > 0.008856){
Y = Math.pow(Y, 1 / 3.000);
}else{
Y = (7.787 * Y) + (16 / 116.000);
}
if (Z > 0.008856){
Z = Math.pow(Z, 1 / 3.000);
}else{
Z = (7.787 * Z) + (16 / 116.000);
}
let Lab_L = (116.000 * Y) - 16.000;//[0,100]
let Lab_A = 500.000 * (X - Y);//[-128,128]
let Lab_B = 200.000 * (Y - Z);//[-128,128] |
|