UNPKG

@cloudcome/utils-core

Version:
251 lines (250 loc) 6.77 kB
function luminance({ r, g, b }) { const a = [r, g, b].map((v) => { const vFinal = v / 255; return vFinal <= 0.03928 ? vFinal / 12.92 : ((vFinal + 0.055) / 1.055) ** 2.4; }); return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722; } function contrast(rgb1, rgb2) { const lum1 = luminance(rgb1); const lum2 = luminance(rgb2); const brightest = Math.max(lum1, lum2); const darkest = Math.min(lum1, lum2); return (brightest + 0.05) / (darkest + 0.05); } function distance(labA, labB) { const deltaL = labA.l - labB.l; const deltaA = labA.a - labB.a; const deltaB = labA.b - labB.b; const c1 = Math.sqrt(labA.a * labA.a + labA.b * labA.b); const c2 = Math.sqrt(labB.a * labB.a + labB.b * labB.b); const deltaC = c1 - c2; let deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC; deltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH); const sc = 1 + 0.045 * c1; const sh = 1 + 0.015 * c1; const deltaLKlsl = deltaL / 1; const deltaCkcsc = deltaC / sc; const deltaHkhsh = deltaH / sh; const i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh; return (i < 0 ? 0 : Math.sqrt(i)) / 100; } function hexToRgb(hex) { const reg = hex.length === 4 ? /^#(.)(.)(.)$/ : /^#(.{2})(.{2})(.{2})$/; const result = reg.exec(hex); if (!result) throw new SyntaxError(`颜色(${hex})表达式有误`); const [_, r, g, b] = result; return { r: Number.parseInt(r.padEnd(2, r), 16), g: Number.parseInt(g.padEnd(2, g), 16), b: Number.parseInt(b.padEnd(2, b), 16) }; } function to16(n) { return Math.round(n).toString(16).padStart(2, "0"); } function rgbToHex(rgb) { return `#${to16(rgb.r)}${to16(rgb.g)}${to16(rgb.b)}`; } const { min: min$2, max: max$2 } = Math; function rgbToHue({ r, g, b }) { r /= 255; g /= 255; b /= 255; const rgbMax = max$2(r, g, b); const rgbMin = min$2(r, g, b); const rgbDiff = rgbMax - rgbMin; const h = rgbDiff === 0 ? 0 : rgbDiff && rgbMax === r ? (g - b) / rgbDiff : rgbMax === g ? 2 + (b - r) / rgbDiff : 4 + (r - g) / rgbDiff; return [60 * (h < 0 ? h + 6 : h), rgbMax, rgbMin, rgbDiff]; } const { min: min$1, max: max$1 } = Math; function rgbToHsl(rgb) { const [hue, max2, min2, diff] = rgbToHue(rgb); const l = (2 * max2 - diff) / 2; const s = min2 === max2 ? 0 : l < 0.5 ? (max2 - min2) / (max2 + min2) : (max2 - min2) / (2 - max2 - min2); return { h: hue, s: s * 100, l: l * 100 }; } function hslToRgb({ h, s, l }) { s /= 100; l /= 100; const a = s * min$1(l, 1 - l); const k = (n) => (n + h / 30) % 12; const f = (n) => l - a * max$1(-1, min$1(k(n) - 3, min$1(9 - k(n), 1))); return { r: 255 * f(0), g: 255 * f(8), b: 255 * f(4) }; } function hslToHex(hsl) { return rgbToHex(hslToRgb(hsl)); } function hexToHsl(hex) { return rgbToHsl(hexToRgb(hex)); } const { min, max } = Math; function rgbToHsv(rgb) { const [hue, max2, min2, diff] = rgbToHue(rgb); return { h: hue, s: max2 && diff / max2 * 100, v: max2 * 100 }; } function hsvToRgb({ h, s, v }) { s /= 100; v /= 100; const k = (n) => (n + h / 60) % 6; const f = (n) => v * (1 - s * max(0, min(k(n), 4 - k(n), 1))); return { r: 255 * f(5), g: 255 * f(3), b: 255 * f(1) }; } function hexToHsv(hex) { return rgbToHsv(hexToRgb(hex)); } function hsvToHex(hsv) { return rgbToHex(hsvToRgb(hsv)); } function rgbToHwb(rgb) { const [hue, max2, min2, diff] = rgbToHue(rgb); return { h: hue, w: min2 * 100, b: (1 - max2) * 100 }; } function hwbToRgb({ h, w: white, b: black }) { white /= 100; black /= 100; const { r, g, b } = hslToRgb({ h, s: 100, l: 50 }); const tot = white + black; if (tot > 1) { white = white / tot; black = black / tot; } const f = (n) => (n / 255 * (1 - white - black) + white) * 255; return { r: f(r), g: f(g), b: f(b) }; } function hwbToHex(hwb) { return rgbToHex(hwbToRgb(hwb)); } function hexToHwb(hex) { return rgbToHwb(hexToRgb(hex)); } function hslLighten(hsl, value) { const hslFinal = { ...hsl }; hslFinal.l = hslFinal.l * (1 + value); return hslFinal; } function hsvBrighten(hsv, value) { const hsvFinal = { ...hsv }; hsvFinal.v = hsvFinal.v * (1 + value); return hsvFinal; } function mix(a, b, weight = 0.5) { return Object.keys(a).reduce((acc, key) => { acc[key] = (b[key] - a[key]) * weight + a[key]; return acc; }, {}); } function rgbToXyz(rgb) { const { r, g, b } = rgb; const [var_R, var_G, var_B] = [r, g, b].map((x) => x / 255).map((x) => x > 0.04045 ? ((x + 0.055) / 1.055) ** 2.4 : x / 12.92).map((x) => x * 100); return { // Observer. = 2°, Illuminant = D65 x: var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805, y: var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722, z: var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505 }; } function xyzToRgb(xyz) { const { x, y, z } = xyz; const var_X = x / 100; const var_Y = y / 100; const var_Z = z / 100; const var_R = var_X * 3.2406 + var_Y * -1.5372 + var_Z * -0.4986; const var_G = var_X * -0.9689 + var_Y * 1.8758 + var_Z * 0.0415; const var_B = var_X * 0.0557 + var_Y * -0.204 + var_Z * 1.057; const [r, g, b] = [var_R, var_G, var_B].map((n) => n > 31308e-7 ? 1.055 * n ** (1 / 2.4) - 0.055 : 12.92 * n).map((n) => n * 255); return { r, g, b }; } const ref_X = 95.047; const ref_Y = 100; const ref_Z = 108.883; function xyzToLab(xyz) { const { x, y, z } = xyz; const [var_X, var_Y, var_Z] = [x / ref_X, y / ref_Y, z / ref_Z].map( (a2) => a2 > 8856e-6 ? a2 ** (1 / 3) : 7.787 * a2 + 16 / 116 ); const l = 116 * var_Y - 16; const a = 500 * (var_X - var_Y); const b = 200 * (var_Y - var_Z); return { l, a, b }; } function labToXyz(lab) { const { l, a, b } = lab; const var_Y = (l + 16) / 116; const var_X = a / 500 + var_Y; const var_Z = var_Y - b / 200; const [X, Y, Z] = [var_X, var_Y, var_Z].map((n) => n ** 3 > 8856e-6 ? n ** 3 : (n - 16 / 116) / 7.787); return { x: X * ref_X, y: Y * ref_Y, z: Z * ref_Z }; } function rgbToLab(rgb) { return xyzToLab(rgbToXyz(rgb)); } function labToRgb(lab) { return xyzToRgb(labToXyz(lab)); } const { abs } = Math; const whiteRGB = { r: 0, g: 0, b: 0 }; const blackRGB = { r: 255, g: 255, b: 255 }; function rgbWhiter(rgb, value) { const rgb2 = value > 0 ? whiteRGB : blackRGB; return mix(rgb, rgb2, abs(value)); } export { contrast, distance, hexToHsl, hexToHsv, hexToHwb, hexToRgb, hslLighten, hslToHex, hslToRgb, hsvBrighten, hsvToHex, hsvToRgb, hwbToHex, hwbToRgb, labToRgb, labToXyz, luminance, mix, rgbToHex, rgbToHsl, rgbToHsv, rgbToHue, rgbToHwb, rgbToLab, rgbToXyz, rgbWhiter, xyzToLab, xyzToRgb }; //# sourceMappingURL=color.mjs.map