/// <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); }