Hey,
Ich bin gestern in LESS auf die luma Funktion gestoßen und wollte sie mal mit JavaScript nachbauen. Das Beispiel liefert für luma(rgb(100, 200, 30)) den Wert 44% – den Wert bekomme ich auch raus. Mein Problem liegt hier bei greyscale bei dem Vergleich mit luma:
@c: luma(hsl(90, 90%, 50%));
color: rgb(@c, @c, @c);
Output: #cacaca
ca ist im Dezimalsystem 202, was darauf hindeutet, dass luma 79.2% zurückgegeben hat. Meine Version von luma liefert allerdings 68% (==> 173) womit ich auf #adadad komme und da frage ich mich, was da falsch läuft.
function luma(str) {
var c = toRgb(str),
sr = c[0] / 255,
sg = c[1] / 255,
sb = c[2] / 255,
r = (sr <= 0.03928) ? sr / 12.92 : Math.pow((sr + 0.055) / 1.055, 2.4),
g = (sg <= 0.03928) ? sg / 12.92 : Math.pow((sg + 0.055) / 1.055, 2.4),
b = (sb <= 0.03928) ? sb / 12.92 : Math.pow((sb + 0.055) / 1.055, 2.4),
l = (0.2126 * r + 0.7152 * g + 0.0722 * b) * 100;
return l;
}
toRgb(str) konvertiert den Farbcode-String nach rgb und liefert die 3 rgb-Werte in einem Array zurück.
Die Formel ist von der bei luma verlinkten Seite.
Kann mir jemand sagen, wer hier was falsch macht?
Reinhard