Enjoy!
function getHSV(r, g, b) { var h, s, v, max, delta; // v (value) is the highest of the RGB values scaled to [0-1] max = Math.max(r, Math.max(g, b)); if (max == 0) return [0, 0, 0]; v = max / 255; // delta is the difference between the largest and smallest of RGB delta = max - Math.min(r, Math.min(g, b)); if (delta == 0) return [0, 0, v]; // No delta = grey, only v is significant // s (saturation) is delta divided by max s = delta / max; // h (hue) is a number in degrees describing the color's angle on the hsv color wheel if (r == max) h = (g - b) / delta; else if (g == max) h = 2 + (b - r) / delta; else if (b == max) h = 4 + (r - g) / delta; // convert hue to degrees if (h < 0) h += 6; h *= 60; return [h, s, v]; } function getRGB(h, s, v) { var quadrant, max, mid, min, fraction; max = Math.round(v * 255); if( s == 0 ) return ([max, max, max]); // Greys // Quadrant is between 0 and 5, where 0, 2, and 4 are red, green, and blue h /= 60; quadrant = Math.floor(h); // fraction is distance away from quadrant representing hue's primary color fraction = (quadrant % 2 == 0) ? (1 - h % 1) : h % 1; // min and mid are the smaller two RGB colors in the final return array // We don't know what primary colors they represent... min = Math.round(max * ( 1 - s )); mid = Math.round(max * ( 1 - s * fraction )); // ...until we check what quadrant we're in switch (quadrant) { // reds case 5: return [max, min, mid]; case 0: return [max, mid, min]; // greens case 1: return [mid, max, min]; case 2: return [min, max, mid]; // blues case 3: return [min, mid, max]; case 4: return [mid, min, max]; } }
No comments:
Post a Comment