44 lines
874 B
TypeScript
44 lines
874 B
TypeScript
|
import { getRgbValue } from '@jiaminghi/color'
|
||
|
|
||
|
function rgb2hsl([r, g, b]: number[]): [h:number, s:string, l:string] {
|
||
|
r = r / 255 // [0, 1]
|
||
|
g = g / 255 // [0, 1]
|
||
|
b = b / 255 // [0, 1]
|
||
|
|
||
|
const max = Math.max(r, g, b)
|
||
|
const min = Math.min(r, g, b)
|
||
|
const d = max - min
|
||
|
|
||
|
const l = (max + min) / 2
|
||
|
const s = d === 0 ? 0 : l > 0.5 ? d / (2 - 2 * l) : d / (2 * l)
|
||
|
|
||
|
let h = 0
|
||
|
if (d !== 0) {
|
||
|
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
|
||
|
default:
|
||
|
break
|
||
|
}
|
||
|
h = h / 6
|
||
|
}
|
||
|
|
||
|
return [h * 360, `${s * 100}%`, `${l * 100}%`]
|
||
|
}
|
||
|
|
||
|
function hex2hsl(hex: string): [h:number, s:string, l:string] {
|
||
|
const [r, g, b] = getRgbValue(hex)
|
||
|
return rgb2hsl([r, g, b])
|
||
|
}
|
||
|
|
||
|
export {
|
||
|
rgb2hsl, hex2hsl,
|
||
|
}
|