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), }; };