static LabColor RgbToLab(RgbColor color, bool adjustContrast)
{
// RGB are assumed to be in [0...255] range
double R = color.R/255d;
double G = color.G/255d;
double B = color.B/255d;
// CIEXYZ coordinates are normalized to [0...1]
double x = 0.4124564 * R + 0.3575761 * G + 0.1804375 * B;
double y = 0.2126729 * R + 0.7151522 * G + 0.0721750 * B;
double z = 0.0193339 * R + 0.1191920 * G + 0.9503041 * B;
double xRatio = x/XN;
double yRatio = y/YN;
double zRatio = z/ZN;
LabColor result = new LabColor {
// L is normalized to [0...100]
L = 116*XyzToLab( yRatio ) - 16,
a = 500*(XyzToLab( xRatio ) - XyzToLab( yRatio )),
b = 200*(XyzToLab( yRatio ) - XyzToLab( zRatio ))
};
if( adjustContrast ) {
result.L *= .75;
}
return result;
}