Created
May 22, 2015 18:55
-
-
Save ReedD/8b216b75e00ff20ceae2 to your computer and use it in GitHub Desktop.
Calculate luma, the lightness of a color between absolute black and the brightest white.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @name Luma | |
* @description | |
* Calculate luma, the lightness of a color between absolute black and the brightest white. | |
* | |
* @author Reed Dadoune <reed@dadoune.com> | |
* @author Alnitak http://stackoverflow.com/a/12043228/3322075 | |
* | |
* @param {float|string} | |
* - {float} r The red value of the color | |
* - {string} r The hex, rgb or rgba value of the color | |
* e.g. #fff, #fff, rgb(255, 255, 255) or rgba(255, 255, 255, 1) | |
* @param {float} g The green value of the color | |
* @param {float} b The blue value of the color | |
* @param {float} a The alpha value of the color | |
* | |
* @returns {float} The luma value of the color | |
*/ | |
function luma(r, g, b, a) { | |
if (arguments.length === 1) { | |
var match; | |
var colorString = String(r); | |
var hexRegex = /^\#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/; | |
var rgbRegex = /^rgb\(([0-9]{1,3}),[ +]?([0-9]{1,3}),[ +]?([0-9]{1,3})\)$/; | |
var rgbaRegex = /^rgba\(([0-9]{1,3}),[ +]?([0-9]{1,3}),[ +]?([0-9]{1,3}),[ +]?([0-9]{1}|(?:[0-9]{1})?\.[0-9]+)\)$/; | |
if (match = colorString.match(hexRegex)) { | |
var hex = match[1]; | |
if (hex.length === 3) { | |
// Convert to 6 | |
hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; | |
} | |
var rgb = parseInt(hex, 16); // convert rrggbb to decimal | |
r = (rgb >> 16) & 0xff; // extract red | |
g = (rgb >> 8) & 0xff; // extract green | |
b = (rgb >> 0) & 0xff; // extract blue | |
} else if (match = colorString.match(rgbRegex)) { | |
r = parseFloat(match[1]); | |
g = parseFloat(match[2]); | |
b = parseFloat(match[3]); | |
} else if (match = colorString.match(rgbaRegex)) { | |
r = parseFloat(match[1]); | |
g = parseFloat(match[2]); | |
b = parseFloat(match[3]); | |
} | |
} else { | |
r = parseFloat(r) || 0; | |
g = parseFloat(g) || 0; | |
b = parseFloat(b) || 0; | |
} | |
var luma = 0.2126 * r + 0.7152 * g + 0.0722 * b; // per ITU-R BT.709 | |
return luma; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment