UNPKG

iobroker.shelly

Version:
101 lines (90 loc) 2.37 kB
/** * Converts an RGB color value to HSV. Conversion formula * adapted from http://en.wikipedia.org/wiki/HSV_color_space. * Assumes r, g, and b are contained in the set [0, 255] and * returns h, s, and v in the set [0, 1]. * * @param r red color value * @param g green color value * @param b blue color value * @returns Array The HSV representation */ function rgbToHsv(r, g, b) { r /= 255; g /= 255; b /= 255; const max = Math.max(r, g, b); const min = Math.min(r, g, b); let h; let s = max; const v = max; const d = max - min; s = !max ? 0 : d / max; if (max === min) { h = 0; // achromatic } else { 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; } h /= 6; } // return [h, s, v]; // return [h * 360, s * 100, v * 100]; return [Math.round(h * 360), Math.round(s * 100), Math.round(v * 100)]; } /** * Converts an HSV color value to RGB. Conversion formula * adapted from http://en.wikipedia.org/wiki/HSV_color_space. * Assumes h, s, and v are contained in the set [0, 1] and * returns r, g, and b in the set [0, 255]. * * @param h * @param s * @param v * @returns Array The RGB representation */ function hsvToRgb(h, s, v) { h = h / 360; s = s / 100; v = v / 100; let r, g, b; const i = Math.floor(h * 6); const f = h * 6 - i; const p = v * (1 - s); const q = v * (1 - f * s); const t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: ((r = v), (g = t), (b = p)); break; case 1: ((r = q), (g = v), (b = p)); break; case 2: ((r = p), (g = v), (b = t)); break; case 3: ((r = p), (g = q), (b = v)); break; case 4: ((r = t), (g = p), (b = v)); break; case 5: ((r = v), (g = p), (b = q)); break; } // return [r * 255, g * 255, b * 255]; return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]; } module.exports = { rgbToHsv, hsvToRgb, };