public static HSVColor RGBtoHSV(RGBColor rgb) { float max, min; HSVColor hsv = new HSVColor(); min = Math.Min(Math.Min(rgb.R, rgb.G), rgb.B); max = Math.Max(Math.Max(rgb.R, rgb.G), rgb.B); hsv.V = max; if (hsv.V < .0001f) { hsv.H = hsv.S = 0; return hsv; } rgb.R /= hsv.V; rgb.G /= hsv.V; rgb.B /= hsv.V; min = Math.Min(Math.Min(rgb.R, rgb.G), rgb.B); max = Math.Max(Math.Max(rgb.R, rgb.G), rgb.B); hsv.S = max - min; if (hsv.S < .0001f) { hsv.H = 0; return hsv; } rgb.R = (rgb.R - min) / (max - min); rgb.G = (rgb.G - min) / (max - min); rgb.B = (rgb.B - min) / (max - min); min = Math.Min(Math.Min(rgb.R, rgb.G), rgb.B); max = Math.Max(Math.Max(rgb.R, rgb.G), rgb.B); if (Math.Abs(max - rgb.R) < .0001f) { hsv.H = 1f/6f * (rgb.G - rgb.B); if (hsv.H < 0) { hsv.H += 1f; } } else if (Math.Abs(max - rgb.G) < .0001f) { hsv.H = 2f/6f + 1f/6f * (rgb.B - rgb.R); } else /* rgb_max == rgb.b */ { hsv.H = 4f/6f + 1f/6f * (rgb.R - rgb.G); } hsv.Alpha = rgb.Alpha; return hsv; }
public static RGBColor HSVtoRGB(HSVColor hsv) { float r, g, b; float h, s, v; r = g = b = 0; h = hsv.H; s = hsv.S; v = hsv.V; if (hsv.H > 1) { hsv.H = hsv.H - (float)Math.Floor(hsv.H); //Rounds down and gives us the remander } float chroma = hsv.V * hsv.S; float hdash = hsv.H * 6f; float x = chroma * (1f - Math.Abs((hdash % 2) - 1f)); if (hdash < 1f) { r = chroma; g = x; } else if (hdash < 2f) { g = chroma; r = x; } else if (hdash < 3f) { g = chroma; b = x; } else if (hdash < 4f) { b = chroma; g = x; } else if (hdash < 5f) { b = chroma; r = x; } else if (hdash < 6f) { r = chroma; b = x; } float min = hsv.V - chroma; r += min; g += min; b += min; return new RGBColor(r,g,b,hsv.Alpha); }