1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- // @flow
- import type {
- HslColor, HslaColor, RgbColor, RgbaColor,
- } from '../types/color'
- function rgbToHsl(color: RgbColor | RgbaColor): HslColor | HslaColor {
- // make sure rgb are contained in a set of [0, 255]
- const red = color.red / 255
- const green = color.green / 255
- const blue = color.blue / 255
- const max = Math.max(red, green, blue)
- const min = Math.min(red, green, blue)
- const lightness = (max + min) / 2
- if (max === min) {
- // achromatic
- if (color.alpha !== undefined) {
- return {
- hue: 0,
- saturation: 0,
- lightness,
- alpha: color.alpha,
- }
- } else {
- return { hue: 0, saturation: 0, lightness }
- }
- }
- let hue
- const delta = max - min
- const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min)
- switch (max) {
- case red:
- hue = (green - blue) / delta + (green < blue ? 6 : 0)
- break
- case green:
- hue = (blue - red) / delta + 2
- break
- default:
- // blue case
- hue = (red - green) / delta + 4
- break
- }
- hue *= 60
- if (color.alpha !== undefined) {
- return {
- hue,
- saturation,
- lightness,
- alpha: color.alpha,
- }
- }
- return { hue, saturation, lightness }
- }
- export default rgbToHsl
|