zhengyiming
3 小时以前 fd06689a59dcdaf03d8f98d9531ad6f2c2b258c3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
export const RGB2Hex = (r: number, g: number, b: number) => {
  let _r = Math.round(r).toString(16);
  let _g = Math.round(g).toString(16);
  let _b = Math.round(b).toString(16);
 
  if (_r.length === 1) _r = '0' + _r;
  if (_g.length === 1) _g = '0' + _g;
  if (_b.length === 1) _b = '0' + _b;
 
  return '#' + _r + _g + _b;
};
 
export const RGBA2HexA = (r: number, g: number, b: number, a = 1) => {
  const hex = RGB2Hex(r, g, b);
 
  let _a = Math.round((a as number) * 255).toString(16);
  if (_a.length === 1) _a = '0' + _a;
 
  return hex + _a;
};
 
export const RGB2HSL = (r: number, g: number, b: number) => {
  r /= 255;
  g /= 255;
  b /= 255;
 
  const minVal = Math.min(r, g, b);
  const maxVal = Math.max(r, g, b);
  const delta = maxVal - minVal;
 
  let h = 0;
  let s = 0;
  const l = maxVal;
  if (delta === 0) {
    h = s = 0;
  } else {
    s = delta / maxVal;
    const dr = ((maxVal - r) / 6 + delta / 2) / delta;
    const dg = ((maxVal - g) / 6 + delta / 2) / delta;
    const db = ((maxVal - b) / 6 + delta / 2) / delta;
 
    if (r === maxVal) {
      h = db - dg;
    } else if (g === maxVal) {
      h = 1 / 3 + dr - db;
    } else if (b === maxVal) {
      h = 2 / 3 + dg - dr;
    }
 
    if (h < 0) {
      h += 1;
    } else if (h > 1) {
      h -= 1;
    }
  }
 
  return [h * 360, s * 100, l * 100];
};
 
export const RGBA2HSLA = (r: number, g: number, b: number, a = 1) => [...RGB2HSL(r, g, b), a];
 
export function HSL2RGB(h: number, s: number, l: number) {
  h = (h / 360) * 6;
  s /= 100;
  l /= 100;
 
  const i = Math.floor(h);
 
  const f = h - i;
  const p = l * (1 - s);
  const q = l * (1 - f * s);
  const t = l * (1 - (1 - f) * s);
 
  const mod = i % 6;
  const r = [l, q, p, p, t, l][mod];
  const g = [t, l, l, q, p, p][mod];
  const b = [p, p, t, l, l, q][mod];
 
  return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
}
 
export const HSLA2RGBA = (h: number, s: number, l: number, a = 1) => [...HSL2RGB(h, s, l), a];
 
export const HSL2Hex = (h: number, s: number, l: number) => {
  const [r, g, b] = HSL2RGB(h, s, l);
  return RGB2Hex(r, g, b);
};
 
export const HSLA2HexA = (h: number, s: number, l: number, a = 1) => {
  const hex = HSL2Hex(h, s, l);
  return `${hex}${a === 0 ? '00' : Math.round(a * 255).toString(16)}`;
};
 
export const hex2RGB = (hex: string) => {
  hex = hex.slice(0, 7);
 
  let r = 0;
  let g = 0;
  let b = 0;
 
  if (hex.length == 4) {
    // 3 digits
    r = Number('0x' + hex[1] + hex[1]);
    g = Number('0x' + hex[2] + hex[2]);
    b = Number('0x' + hex[3] + hex[3]);
  } else if (hex.length == 7) {
    // 6 digits
    r = Number('0x' + hex[1] + hex[2]);
    g = Number('0x' + hex[3] + hex[4]);
    b = Number('0x' + hex[5] + hex[6]);
  }
 
  return [r, g, b];
};
 
export const hexA2RGBA = (hexA: string) => {
  const rgb = hex2RGB(hexA);
  const a = Number('0x' + hexA[7] + hexA[8]);
  return [...rgb, Number((a / 255).toFixed(2))];
};
 
export const hex2HSL = (hex: string) => {
  const [r, g, b] = hex2RGB(hex);
  return RGB2HSL(r, g, b);
};
 
export const hexA2HSLA = (hexA: string) => {
  const [r, g, b, a] = hexA2RGBA(hexA);
  return RGBA2HSLA(r, g, b, a);
};