public static void CIELabtoRGB(Color_CIELab CIELab, out Color RGB) { double X = 0; double Y = 0; double Z = 0; CIELabtoXYZ(CIELab, out X, out Y, out Z); XYZtoRGB(X, Y, Z, out RGB); }
public static void RGBtoCIELab(Color RGB, out Color_CIELab CIELab) { double X = 0; double Y = 0; double Z = 0; RGBtoXYZ(RGB, out X, out Y, out Z); XYZtoCIELab(X, Y, Z, out CIELab); }
public static void XYZtoCIELab(double X, double Y, double Z, out Color_CIELab CIELab) { double ref_X = 95.047; double ref_Y = 100.000; double ref_Z = 108.883; double var_X = X / ref_X; //ref_X = 95.047 Observer= 2°, Illuminant= D65 double var_Y = Y / ref_Y; //ref_Y = 100.000 double var_Z = Z / ref_Z; //ref_Z = 108.883 if (var_X > 0.008856) { var_X = Math.Pow(var_X, (double)1 / (double)3); } else { var_X = (7.787 * var_X) + ((double)16 / (double)116); } if (var_Y > 0.008856) { var_Y = Math.Pow(var_Y, (double)1 / (double)3); } else { var_Y = (7.787 * var_Y) + ((double)16 / (double)116); } if (var_Z > 0.008856) { var_Z = Math.Pow(var_Z, (double)1 / (double)3); } else { var_Z = (7.787 * var_Z) + ((double)16 / (double)116); } CIELab = new Color_CIELab(); CIELab.L = (116 * var_Y) - 16; CIELab.a = 500 * (var_X - var_Y); CIELab.b = 200 * (var_Y - var_Z); }
public static void CIELabtoXYZ(Color_CIELab CIELab, out double X, out double Y, out double Z) { double ref_X = 95.047; double ref_Y = 100.000; double ref_Z = 108.883; double var_Y = (CIELab.L + 16) / 116; double var_X = CIELab.a / 500 + var_Y; double var_Z = var_Y - CIELab.b / 200; if (Math.Pow(var_Y, (double)3) > 0.008856) { var_Y = Math.Pow(var_Y, (double)3); } else { var_Y = (var_Y - (double)16 / (double)116) / 7.787; } if (Math.Pow(var_X, (double)3) > 0.008856) { var_X = Math.Pow(var_X, (double)3); } else { var_X = (var_X - (double)16 / (double)116) / 7.787; } if (Math.Pow(var_Z, (double)3) > 0.008856) { var_Z = Math.Pow(var_Z, (double)3); } else { var_Z = (var_Z - (double)16 / (double)116) / 7.787; } X = ref_X * var_X; //ref_X = 95.047 Observer= 2°, Illuminant= D65 Y = ref_Y * var_Y; //ref_Y = 100.000 Z = ref_Z * var_Z; //ref_Z = 108.883 }