Пример #1
0
    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);
    }
Пример #2
0
    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);
    }
Пример #3
0
    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);
    }
Пример #4
0
    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
    }