index.js 2.84 KB
export const RGB = ({ r, g, b }) => {
  return `rgb(${r}, ${g}, ${b})`;
};

// 将rgb颜色转成hex
export const RGBToHex = (color = '') => {
  const rgb = color.split(',');
  const r = parseInt(rgb[0].split('(')[1]);
  const g = parseInt(rgb[1]);
  const b = parseInt(rgb[2].split(')')[0]);
  const hex = '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
  return hex;
};

// 将hex颜色转成rgb
export const HexToRGBA = (hex = '', opacity) => {
  const red = parseInt(`0x${hex.slice(1, 3)}`);
  const green = parseInt(`0x${hex.slice(3, 5)}`);
  const blue = parseInt(`0x${hex.slice(5, 7)}`);
  const RGBA = `rgba(${red},${green},${blue},${opacity})`;
  return { red, green, blue, rgba: RGBA };
};

const RGB_MAX = 255;
const HUE_MAX = 360;
const SV_MAX = 100;

export const HexToHSL = hex => {
  const { red, green, blue } = HexToRGBA(hex);
  return RGBToHSL(red, green, blue);
};

export const HSLToRGB = function (h, s, l) {
  function _hue2Rgb(p, q, t) {
    if (t < 0) t += 1;
    if (t > 1) t -= 1;
    if (t < 1 / 6) return p + (q - p) * 6 * t;
    if (t < 1 / 2) return q;
    if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
    return p;
  }

  function _normalizeAngle(degrees) {
    return ((degrees % 360) + 360) % 360;
  }

  if (typeof h === 'object') {
    const args = h;
    h = args.h;
    s = args.s;
    l = args.l;
  }

  var r, g, b;

  h = _normalizeAngle(h);
  h = h === HUE_MAX ? 1 : (h % HUE_MAX) / parseFloat(HUE_MAX);
  s = s === SV_MAX ? 1 : (s % SV_MAX) / parseFloat(SV_MAX);
  l = l === SV_MAX ? 1 : (l % SV_MAX) / parseFloat(SV_MAX);

  if (s === 0) {
    r = g = b = l; // achromatic
  } else {
    var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
    var p = 2 * l - q;
    r = _hue2Rgb(p, q, h + 1 / 3);
    g = _hue2Rgb(p, q, h);
    b = _hue2Rgb(p, q, h - 1 / 3);
  }

  return {
    r: Math.round(r * RGB_MAX),
    g: Math.round(g * RGB_MAX),
    b: Math.round(b * RGB_MAX),
  };
};

export const RGBToHSL = (r, g, b) => {
  if (typeof r === 'object') {
    const args = r;
    r = args.r;
    g = args.g;
    b = args.b;
  }
  // It converts [0,255] format, to [0,1]
  r = r === RGB_MAX ? 1 : (r % RGB_MAX) / parseFloat(RGB_MAX);
  g = g === RGB_MAX ? 1 : (g % RGB_MAX) / parseFloat(RGB_MAX);
  b = b === RGB_MAX ? 1 : (b % RGB_MAX) / parseFloat(RGB_MAX);

  var max = Math.max(r, g, b);
  var min = Math.min(r, g, b);
  var h,
    s,
    l = (max + min) / 2;

  if (max === min) {
    h = s = 0; // achromatic
  } else {
    var d = max - min;
    s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
    switch (max) {
      case r:
        h = (g - b) / d + (g < b ? 6 : 0);
        break;
      case g:
        h = (b - r) / d + 2;
        break;
      case b:
        h = (r - g) / d + 4;
        break;
    }
    h /= 6;
  }

  return {
    h: Math.round(h * HUE_MAX),
    s: Math.round(s * SV_MAX),
    l: Math.round(l * SV_MAX),
  };
};