private static HslType HexToHsl(this string hexIn) { /* * the source text is taken from here (with minor modifications): * https://css-tricks.com/converting-color-spaces-in-javascript/ */ // Convert hex to RGB first. Ignore opacity RgbType rgb = hexIn.HexToRgb(1); // Then to HSL rgb.ToHsl(); var cmin = rgb.Min(); var cmax = rgb.Max(); var delta = cmax - cmin; var hls = new HslType { Hue = ComputeH(rgb, cmax, delta), Lightness = (cmax + cmin) / 2 }; hls.Saturation = delta == 0 ? 0 : delta / (1 - Math.Abs(2 * hls.Lightness - 1)); hls.Saturation = Convert.ToDouble(String.Format("{0:0.0}", hls.Saturation * 100)); hls.Lightness = Convert.ToDouble(String.Format("{0:0.0}", hls.Lightness * 100)); hls.Round(); return(hls); }
public HslType(HslType offset) { if (offset == null) { throw new ArgumentNullException(nameof(offset)); } Hue = offset.Hue; Saturation = offset.Saturation; Lightness = offset.Lightness; }
public static HslType ColorShiftHsl(this string main, HslType offset) { if (main == null) { throw new ArgumentNullException(nameof(main)); } if (offset == null) { throw new ArgumentNullException(nameof(offset)); } var offsetCopy = new HslType(offset); HslType color = main.HexToHsl(); color.Hue = NormalizeValue(color.Hue + offsetCopy.Hue, minValue: 0, maxValue: 360); color.Saturation = NormalizeValue(color.Saturation + offsetCopy.Saturation); color.Lightness = NormalizeValue(color.Lightness + offsetCopy.Lightness); return(color); }
public static (string, string) GetGradientColor(this string color) { if (color == null) { throw new ArgumentNullException(nameof(color)); } HslType first = color.HexToHsl(); HslType second = color.HexToHsl(); // hue circle degrees approximation bool isRed = (first.Hue >= 0 && first.Hue < 45) || (first.Hue >= 285); bool isYellow = first.Hue >= 45 && first.Hue < 85; bool isGreen = first.Hue >= 85 && first.Hue < 165; bool isBlue = first.Hue >= 165 && first.Hue < 285; bool isUndersaturated = first.Saturation < 30; // i.e. too pale, gray-ish, monotone if (isRed) { first.Hue += 11; first.Saturation += 27; first.Lightness += 8; } else if (isYellow) { first.Hue += 3; first.Lightness += 9; second.Hue -= 2; } else if (isGreen) { first.Hue += 13; first.Saturation -= 5; first.Lightness += 7; second.Hue -= 3; second.Saturation -= 1; second.Lightness -= 6; } else if (isBlue) { first.Hue -= 15; first.Saturation += 3; first.Lightness += 2; } if (isUndersaturated) { first.Lightness += 6; second.Lightness -= 2; } // restrictions and validations if (first.Hue < 0) { first.Hue += 360; } if (first.Hue > 0) { Math.Round(first.Hue = first.Hue % 360); } if (second.Hue < 0) { second.Hue += 360; } if (second.Hue > 0) { Math.Round(second.Hue = second.Hue % 360); } first.Saturation = first.Saturation > 0 ? first.Saturation : 0; first.Saturation = first.Saturation < 100 ? first.Saturation : 100; second.Saturation = second.Saturation > 0 ? second.Saturation : 0; second.Saturation = second.Saturation < 100 ? second.Saturation : 100; first.Lightness = first.Lightness > 0 ? first.Lightness : 0; first.Lightness = first.Lightness < 100 ? first.Lightness : 100; second.Lightness = second.Lightness > 0 ? second.Lightness : 0; second.Lightness = second.Lightness < 100 ? second.Lightness : 100; return(first.ToString(), second.ToString()); }