hsl-hsv.js

  1. /**
  2. * @func hsl2hsv
  3. * @desc Return an HSV color from an HSL color
  4. * @param {Number} h - Hue Angle (0 - 360)
  5. * @param {Number} s - Saturation (0 - 100)
  6. * @param {Number} l - Lightness (0 - 100)
  7. * @return {ArrayHSV}
  8. * @example
  9. * hsl2hsv(0, 100, 50)
  10. * @link https://gist.github.com/defims/0ca2ef8832833186ed396a2f8a204117
  11. */
  12. export function hsl2hsv(hslH, hslS, hslL) {
  13. const hsv1 = hslS * (hslL < 50 ? hslL : 100 - hslL) / 100;
  14. const hsvS = hsv1 === 0 ? 0 : 2 * hsv1 / (hslL + hsv1) * 100;
  15. const hsvV = hslL + hsv1;
  16. return [ hslH, hsvS, hsvV ];
  17. }
  18. /**
  19. * @func hsv2hsl
  20. * @desc Return an HSL color from an HSV color
  21. * @param {Number} h - Hue Angle (0 - 360)
  22. * @param {Number} s - Saturation (0 - 100)
  23. * @param {Number} v - Value (0 - 100)
  24. * @return {ArrayHSL}
  25. * @example
  26. * hsv2hsl(0, 0, 0) // => [0, 100, 50]
  27. * @link https://gist.github.com/defims/0ca2ef8832833186ed396a2f8a204117
  28. */
  29. export function hsv2hsl(hsvH, hsvS, hsvV) {
  30. const hslL = (200 - hsvS) * hsvV / 100;
  31. const [ hslS, hslV ] = [
  32. hslL === 0 || hslL === 200 ? 0 : hsvS * hsvV / 100 / (hslL <= 100 ? hslL : 200 - hslL) * 100,
  33. hslL * 5 / 10
  34. ];
  35. return [ hsvH, hslS, hslV ];
  36. }