public static HSLColour ToHSL(this HSVColour hsv) { if (hsv.S == ColourSpaceConstants.ZERO) { return(new HSLColour(hsv.H, hsv.V, hsv.V, hsv.A)); } var s = 0; var l = 0; return(new HSLColour(hsv.H, s, l, hsv.A)); }
public static SRGBColour ToSRGB(this HSVColour hsv) { var r = new UnitColourComponent(ColourSpaceConstants.ZERO); var g = new UnitColourComponent(ColourSpaceConstants.ZERO); var b = new UnitColourComponent(ColourSpaceConstants.ZERO); // https://en.wikipedia.org/wiki/HSL_and_HSV#From_HSV // http://www.easyrgb.com/en/math.php if (hsv.S == ColourSpaceConstants.ZERO) { var vb = hsv.V.ToByteColour(); return(new SRGBColour(vb, vb, vb, hsv.A.ToByteColour())); } // Calcs simplified from Wikipedia and verified to match calcs at EasyRGB var h_unit = hsv.H.Value / ColourSpaceConstants.SIXTY; while (h_unit >= ColourSpaceConstants.SIX) { h_unit -= ColourSpaceConstants.SIX; } var h_int = Math.Floor(h_unit); var v = hsv.V.ToByteColour(); var var_1 = ((UnitColourComponent)(hsv.V.Value * (ColourSpaceConstants.ONE - hsv.S.Value))).ToByteColour(); // 0 + m var var_2 = ((UnitColourComponent)(hsv.V.Value * (ColourSpaceConstants.ONE - hsv.S.Value * (h_unit - h_int)))).ToByteColour(); // m + X (1<=H<=2, 3<=H<=4, 5<=H<=6) var var_3 = ((UnitColourComponent)(hsv.V.Value * (ColourSpaceConstants.ONE - hsv.S.Value * (1 - (h_unit - h_int))))).ToByteColour(); // m + X (0<=H<=1, 2<=H<=3, 4<=H<=5) switch (h_int) { case 0: return(new SRGBColour(v, var_3, var_1, hsv.A.ToByteColour())); case 1: return(new SRGBColour(var_2, v, var_1, hsv.A.ToByteColour())); case 2: return(new SRGBColour(var_1, v, var_3, hsv.A.ToByteColour())); case 3: return(new SRGBColour(var_1, var_2, v, hsv.A.ToByteColour())); case 4: return(new SRGBColour(var_3, var_1, v, hsv.A.ToByteColour())); default: return(new SRGBColour(v, var_1, var_2, hsv.A.ToByteColour())); } }