Пример #1
0
        public static HSLColor FromRGB(int r, int g, int b)
        {
            ExceptionUtils.ThrowIfNotInRange(r, 0, 255);
            ExceptionUtils.ThrowIfNotInRange(g, 0, 255);
            ExceptionUtils.ThrowIfNotInRange(b, 0, 255);

            double var_R = (r / 255.0);
            double var_G = (g / 255.0);
            double var_B = (b / 255.0);

            double var_Min = Math.Min(Math.Min(var_R, var_G), var_B);
            double var_Max = Math.Max(Math.Max(var_R, var_G), var_B);
            double del_Max = var_Max - var_Min;

            double L = (var_Max + var_Min) / 2.0;
            double H, S;

            if (del_Max == 0.0)
            {
                H = 0.0;
                S = 0.0;
            }
            else
            {
                if (L < 0.5)
                {
                    S = del_Max / (var_Max + var_Min);
                }
                else
                {
                    S = del_Max / (2.0 - var_Max - var_Min);
                }

                double del_R = (((var_Max - var_R) / 6.0) + (del_Max / 2.0)) / del_Max;
                double del_G = (((var_Max - var_G) / 6.0) + (del_Max / 2.0)) / del_Max;
                double del_B = (((var_Max - var_B) / 6.0) + (del_Max / 2.0)) / del_Max;

                if (var_R == var_Max)
                {
                    H = del_B - del_G;
                }
                else if (var_G == var_Max)
                {
                    H = (1.0 / 3.0) + del_R - del_B;
                }
                else // (var_B == var_Max)
                {
                    H = (2.0 / 3.0) + del_G - del_R;
                }

                if (H < 0.0)
                {
                    H += 1.0;
                }
                if (H > 1.0)
                {
                    H -= 1.0;
                }
            }
            return(new HSLColor(H, S, L));
        }