2020-10-22 00:45:27 +00:00
|
|
|
export default function rgbToHSv({ red, green, blue }) {
|
2021-03-17 13:01:53 +00:00
|
|
|
let rr, gg, bb, h, s;
|
2020-10-22 00:45:27 +00:00
|
|
|
|
2021-03-17 13:01:53 +00:00
|
|
|
const rabs = red / 255;
|
|
|
|
const gabs = green / 255;
|
|
|
|
const babs = blue / 255;
|
2020-11-04 12:01:18 +00:00
|
|
|
|
2021-03-17 13:01:53 +00:00
|
|
|
const v = Math.max(rabs, gabs, babs);
|
|
|
|
const diff = v - Math.min(rabs, gabs, babs);
|
2021-04-08 19:02:31 +00:00
|
|
|
const diffc = (c) => (v - c) / 6 / diff + 1 / 2;
|
2020-11-04 12:01:18 +00:00
|
|
|
|
2021-03-17 13:01:53 +00:00
|
|
|
if (diff === 0) {
|
|
|
|
h = 0;
|
|
|
|
s = 0;
|
|
|
|
} else {
|
|
|
|
s = diff / v;
|
|
|
|
rr = diffc(rabs);
|
|
|
|
gg = diffc(gabs);
|
|
|
|
bb = diffc(babs);
|
2020-10-22 00:45:27 +00:00
|
|
|
|
2021-04-08 19:02:31 +00:00
|
|
|
if (rabs === v) {
|
2021-03-17 13:01:53 +00:00
|
|
|
h = bb - gg;
|
|
|
|
} else if (gabs === v) {
|
2022-04-11 21:57:07 +00:00
|
|
|
h = 1 / 3 + rr - bb;
|
2021-03-17 13:01:53 +00:00
|
|
|
} else if (babs === v) {
|
2022-04-11 21:57:07 +00:00
|
|
|
h = 2 / 3 + gg - rr;
|
2021-03-17 13:01:53 +00:00
|
|
|
}
|
2021-01-16 22:43:46 +00:00
|
|
|
|
2021-03-17 13:01:53 +00:00
|
|
|
if (h < 0) {
|
|
|
|
h += 1;
|
|
|
|
} else if (h > 1) {
|
|
|
|
h -= 1;
|
2020-10-22 00:45:27 +00:00
|
|
|
}
|
2021-03-17 13:01:53 +00:00
|
|
|
}
|
2020-10-22 00:45:27 +00:00
|
|
|
|
2021-03-17 13:01:53 +00:00
|
|
|
return {
|
|
|
|
hue: Math.round(h * 360),
|
|
|
|
saturation: Math.round(s * 100),
|
|
|
|
value: Math.round(v * 100),
|
|
|
|
};
|
2020-10-22 00:45:27 +00:00
|
|
|
}
|