public CIELAB(CIEXYZ xyz) { double delta = 6.0 / 29.0; double fx = xyz.X / Xn > Math.Pow(delta, 3) ? Math.Pow(xyz.X / Xn, 1.0 / 3.0) : (1.0 / 3.0) * Math.Pow((1 / delta), 2) * xyz.X / Xn + (4.0 / 29.0); double fy = xyz.Y / Yn > Math.Pow(delta, 3) ? Math.Pow(xyz.Y / Yn, 1.0 / 3.0) : (1.0 / 3.0) * Math.Pow((1 / delta), 2) * xyz.Y / Yn + (4.0 / 29.0); double fz = xyz.Z / Zn > Math.Pow(delta, 3) ? Math.Pow(xyz.Z / Zn, 1.0 / 3.0) : (1.0 / 3.0) * Math.Pow((1 / delta), 2) * xyz.Z / Zn + (4.0 / 29.0); L = 116.0 * fy - 16.0; a = 500.0 * (fx - fy); b = 200.0 * (fy - fz); }
public static CIELAB Parse(CIEXYZ xyz) { CIELAB lab; lab.L = 116.0 * Fxyz(xyz.Y / Yn) - 16; lab.a = 500.0 * (Fxyz(xyz.X / Xn) - Fxyz(xyz.Y / Yn)); lab.b = 200.0 * (Fxyz(xyz.Y / Yn) - Fxyz(xyz.Z / Zn)); int ls = (int)(2.55 * lab.L + 4); int As = (int)(lab.a + 4); int Bs = (int)(lab.b + 4); lab.L = ls; lab.a = As; lab.b = Bs; return lab; }