Skip to content

Instantly share code, notes, and snippets.

@rlemon

rlemon/color.js Secret

Created March 27, 2013 20:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rlemon/0f2f71ff691c6d500105 to your computer and use it in GitHub Desktop.
Save rlemon/0f2f71ff691c6d500105 to your computer and use it in GitHub Desktop.
function hsvToRgb(h, s, v) {
var s = s / 100,
v = v / 100;
var hi = Math.floor((h / 60) % 6);
var f = (h / 60) - hi;
var p = v * (1 - s);
var q = v * (1 - f * s);
var t = v * (1 - (1 - f) * s);
var rgb = [];
switch (hi) {
case 0:
rgb = [v, t, p];
break;
case 1:
rgb = [q, v, p];
break;
case 2:
rgb = [p, v, t];
break;
case 3:
rgb = [p, q, v];
break;
case 4:
rgb = [t, p, v];
break;
case 5:
rgb = [v, p, q];
break;
}
var r = Math.min(255, Math.round(rgb[0] * 256)),
g = Math.min(255, Math.round(rgb[1] * 256)),
b = Math.min(255, Math.round(rgb[2] * 256));
return [r, g, b];
}
function rgbToHsv(r, g, b) {
var min = Math.min(r, g, b),
max = Math.max(r, g, b),
delta = max - min,
h, s, v = max;
v = Math.floor(max / 255 * 100);
if (max != 0) {
s = Math.floor(delta / max * 100);
} else {
// black
return [0, 0, 0];
}
if (r == max) {
h = (g - b) / delta; // between yellow & magenta
} else if (g == max) {
h = 2 + (b - r) / delta; // between cyan & yellow
} else {
h = 4 + (r - g) / delta; // between magenta & cyan
}
h = Math.floor(h * 60); // degrees
if (h < 0) {
h += 360;
}
return [h, s, v];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment