예제 #1
0
        /// <summary>
        /// Converts a color into a HSV object
        /// </summary>
        /// <param name="rgb"></param>
        /// <returns></returns>
        public static HSV FromColor(Color rgb)
        {
            HSV hsl = new HSV();

            hsl.H = 0; // default to black
            hsl.S = 0;
            hsl.V = 0;
            hsl.A = (double)rgb.A / 255.0;


            double deg1 = 1.0 / 360.0;
            double h    = 0.0;

            ColorPair r = new ColorPair()
            {
                val = (double)rgb.R / 255.0, channel = "R"
            };
            ColorPair g = new ColorPair()
            {
                val = (double)rgb.G / 255.0, channel = "G"
            };
            ColorPair b = new ColorPair()
            {
                val = (double)rgb.B / 255.0, channel = "B"
            };

            ColorPair[] values = new ColorPair[] { r, g, b };

            ColorPair max = values.OrderByDescending(v => v.val).First();
            ColorPair min = values.OrderBy(v => v.val).First();

            if (min.channel == max.channel)
            {
                h = 0;
            }
            else
            {
                switch (max.channel)
                {
                case "R":
                    h = 60 * deg1 * (0 + (g.val - b.val) / (max.val - min.val));
                    break;

                case "G":
                    h = 60 * deg1 * (2 + (b.val - r.val) / (max.val - min.val));
                    break;

                case "B":
                    h = 60 * deg1 * (4 + (r.val - g.val) / (max.val - min.val));
                    break;

                default:
                    h = 0;
                    break;
                }
            }
            if (h < 0)
            {
                h += 1;
            }
            hsl.H = h;

            if (max.val == 0)
            {
                hsl.S = 0;
            }
            else
            {
                hsl.S = (max.val - min.val) / max.val;
            }

            hsl.V = max.val;

            return(hsl);
        }