More than fifty shades of...?
"One of the questions I have came to face earlier in my project is how precisely could I adjust a certain shade of colour to be either darker or lighter to my whim. Some of the earlier thought suggested I simply add or subtract a value from each of the R, G, B components. While it could serve suitably well enough for monochrome, that is not the type of colour I mostly operate in. Thus again, Google was to be for me. Most of the suggestions I came upon agreed on this one particular method. Here's what they said."
"Actually, I was kidding. Though the concept does involve light of some sort. It is though an derivative of an RGB color model called HSL that we'll achieve precisely just that."
"So the first question, What is RGB?"
"RGB, each abbreviates for Red, Green, Blue, describes what kind of light needs to be emitted to produce a given color. Light is added together to create form from out of the darkness. (RGB is an additive colour.) It was then from RGB that two other representations were designed, namely HSL and HSV. It is HSL, we'll focus upon."
"I suppose you've already guessed out what I am about to do here. (For the code, there's already one written here."
"From RGB, convert the colour into its HSL representation. Adjust the lightness value, then convert it back."
/** * Converts an RGB color value to HSL. Conversion formula * adapted from http://en.wikipedia.org/wiki/HSL_color_space. * Assumes r, g, and b are contained in the set [0, 255] and * returns h, s, and l in the set [0, 1]. * * @param Number r The red color value * @param Number g The green color value * @param Number b The blue color value * @return Array The HSL representation */ function rgbToHsl(r, g, b){ r /= 255, g /= 255, b /= 255; var max = Math.max(r, g, b), min = Math.min(r, g, b); var h, s, l = (max + min) / 2; if(max == min){ h = s = 0; // achromatic }else{ var d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); 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, l]; }
/** * Converts an HSL color value to RGB. Conversion formula * adapted from http://en.wikipedia.org/wiki/HSL_color_space. * Assumes h, s, and l are contained in the set [0, 1] and * returns r, g, and b in the set [0, 255]. * * @param Number h The hue * @param Number s The saturation * @param Number l The lightness * @return Array The RGB representation */ function hslToRgb(h, s, l){ var r, g, b; if(s == 0){ r = g = b = l; // achromatic }else{ function hue2rgb(p, q, t){ if(t < 0) t += 1; if(t > 1) t -= 1; if(t < 1/6) return p + (q - p) * 6 * t; if(t < 1/2) return q; if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; return p; } var q = l < 0.5 ? l * (1 + s) : l + s - l * s; var p = 2 * l - q; r = hue2rgb(p, q, h + 1/3); g = hue2rgb(p, q, h); b = hue2rgb(p, q, h - 1/3); } return [r * 255, g * 255, b * 255]; }