public static (double, double, double) RgbToHsl(double r, double g, double b) { double h, s, l; double min = Math.Min(Math.Min(r, g), b); double max = Math.Max(Math.Max(r, g), b); double delta = max - min; l = (max + min) / 2.0; if (delta <= 0.01) { h = 0.0; // reduce saturation for low lightness colors s = ColorMath.LinearInterpolation(delta, 0.005, 0.01, 0, delta / (max + min)); } else { s = l <= 0.5 ? delta / (max + min) : delta / (2.0 - max - min); double hue; if (r >= max) { hue = (g - b) / 6.0 / delta; } else if (g >= max) { hue = 1.0 / 3.0 + (b - r) / 6.0 / delta; } else { hue = 2.0 / 3.0 + (r - g) / 6.0 / delta; } if (hue < 0.0) { hue += 1.0; } if (hue > 1.0) { hue -= 1.0; } h = hue * 360.0; } return(h, s, l); }
public static (double, double, double) RgbToHsv(double r, double g, double b) { double delta, min; double h = 0.0, s, v; min = Math.Min(Math.Min(r, g), b); v = Math.Max(Math.Max(r, g), b); delta = v - min; if (v <= 0.12) { // reduce saturation for low value colors s = ColorMath.LinearInterpolation(v, 0.005, 0.12, 0, delta / v); } else { s = delta / v; } if (s <= 0.001) { h = 0.0; } else { if (r.AboutEqual(v)) { h = (g - b) / delta; } else if (g.AboutEqual(v)) { h = 2.0 + (b - r) / delta; } else if (b.AboutEqual(v)) { h = 4.0 + (r - g) / delta; } h *= 60.0; if (h < 0.0) { h = h + 360.0; } } return(h, s, v); }