// New Color Label clicked, calculate optimal params and update private void ColorEditor_RequestSetNewColor(object sender, EventArgs e) { ColorDialog cdial = new ColorDialog(); DialogResult dr = cdial.ShowDialog(); if (dr == System.Windows.Forms.DialogResult.Cancel) return; ImageProcessor p = resourceManager.Processors[cmbColorProcessors.Text]; ColorRGB exc = new ColorRGB(cdial.Color); tmpProcessor.HA = GetRelation(tmpProcessor.HueMode, tmpProcessor.BaseColor.H, exc.H); tmpProcessor.SA = GetRelation(tmpProcessor.SaturationMode, tmpProcessor.BaseColor.S, exc.S); tmpProcessor.LA = GetRelation(tmpProcessor.LightnessMode, tmpProcessor.BaseColor.L, exc.L); SyncTmpToUI(); ApplyColorScheme(); }
// Given H,S,L,A in range of 0-1 // Returns a Color (RGB struct) in range of 0-255 public static ColorRGB FromHSLA(double H, double S, double L, double A) { double v; double r, g, b; if (A > 1.0) A = 1.0; r = L; // default to gray g = L; b = L; v = (L <= 0.5) ? (L * (1.0 + S)) : (L + S - L * S); if (v > 0) { double m; double sv; int sextant; double fract, vsf, mid1, mid2; m = L + L - v; sv = (v - m) / v; H *= 6.0; sextant = (int)H; fract = H - sextant; vsf = v * sv * fract; mid1 = m + vsf; mid2 = v - vsf; switch (sextant) { case 0: r = v; g = mid1; b = m; break; case 1: r = mid2; g = v; b = m; break; case 2: r = m; g = v; b = mid1; break; case 3: r = m; g = mid2; b = v; break; case 4: r = mid1; g = m; b = v; break; case 5: r = v; g = m; b = mid2; break; } } ColorRGB rgb = new ColorRGB(); rgb.R = Convert.ToByte(r * 255.0f); rgb.G = Convert.ToByte(g * 255.0f); rgb.B = Convert.ToByte(b * 255.0f); rgb.A = Convert.ToByte(A * 255.0f); return rgb; }