using System; using System.Drawing; namespace Developpez.Dotnet.Drawing { /// /// Fournit des méthodes d'extension pour la manipulation de couleurs /// public static class ColorExtensions { /// /// Convertit une couleur en niveau de gris /// /// Couleur à convertir /// Couleur équivalente en niveau de gris public static Color ToGrayScale(this Color color) { byte gray = (byte) Math.Round(color.R * .3f + color.G * .59f + color.B * .11f); return Color.FromArgb(color.A, gray, gray, gray); } /// /// Convertit une couleur RGB en couleur HSL /// /// Couleur RGB à convertir /// Couleur équivalente dans l'espace colorimétrique HSL public static HslColor ToHsl(this Color color) { double hue = color.GetHue(); double saturation = color.GetSaturation(); double lightness = color.GetBrightness(); return new HslColor(hue, saturation, lightness); } /// /// Convertit une couleur HSL en couleur RGB /// /// Couleur HSL à convertir /// Couleur équivalente dans l'espace colorimétrique RGB public static Color ToRgb(this HslColor hslColor) { double hue = hslColor.H; double saturation = hslColor.S; double lightness = hslColor.L; byte r, g, b; if (saturation == 0) { r = (byte)Math.Round(lightness * 255d); g = (byte)Math.Round(lightness * 255d); b = (byte)Math.Round(lightness * 255d); } else { double t1, t2; double th = hue / 360.0d; if (lightness < 0.5d) { t2 = lightness * (1d + saturation); } else { t2 = (lightness + saturation) - (lightness * saturation); } t1 = 2d * lightness - t2; double tr, tg, tb; tr = th + (1.0d / 3.0d); tg = th; tb = th - (1.0d / 3.0d); tr = ColorCalc(tr, t1, t2); tg = ColorCalc(tg, t1, t2); tb = ColorCalc(tb, t1, t2); r = (byte)Math.Round(tr * 255d); g = (byte)Math.Round(tg * 255d); b = (byte)Math.Round(tb * 255d); } return Color.FromArgb(r, g, b); } private static double ColorCalc(double c, double t1, double t2) { if (c < 0) c += 1d; if (c > 1) c -= 1d; if (6.0d * c < 1.0d) return t1 + (t2 - t1) * 6.0d * c; if (2.0d * c < 1.0d) return t2; if (3.0d * c < 2.0d) return t1 + (t2 - t1) * (2.0d / 3.0d - c) * 6.0d; return t1; } /// /// Convertit une couleur RGB en couleur HSV /// /// Couleur RGB à convertir /// Couleur équivalente dans l'espace colorimétrique HSV public static HsvColor ToHsv(this Color color) { int max = Math.Max(color.R, Math.Max(color.G, color.B)); int min = Math.Min(color.R, Math.Min(color.G, color.B)); double hue = color.GetHue(); double saturation = (max == 0) ? 0 : 1d - (1d * min / max); double value = max / 255d; return new HsvColor(hue, saturation, value); } /// /// Convertit une couleur HSV en couleur RGB /// /// Couleur HSL à convertir /// Couleur équivalente dans l'espace colorimétrique RGB public static Color ToRgb(this HsvColor hsvColor) { double hue = hsvColor.H; double saturation = hsvColor.S; double value = hsvColor.V; int hi = Convert.ToInt32(Math.Floor(hue / 60)) % 6; double f = hue / 60 - Math.Floor(hue / 60); value = value * 255; int v = Convert.ToInt32(value); int p = Convert.ToInt32(value * (1 - saturation)); int q = Convert.ToInt32(value * (1 - f * saturation)); int t = Convert.ToInt32(value * (1 - (1 - f) * saturation)); if (hi == 0) return Color.FromArgb(255, v, t, p); if (hi == 1) return Color.FromArgb(255, q, v, p); if (hi == 2) return Color.FromArgb(255, p, v, t); if (hi == 3) return Color.FromArgb(255, p, q, v); if (hi == 4) return Color.FromArgb(255, t, p, v); return Color.FromArgb(255, v, p, q); } } }