@cloudcome/utils-core
Version:
cloudcome core utils
251 lines (250 loc) • 6.77 kB
JavaScript
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