
Model HSL i HSLA
HSL to tzw. model kolorów dla artystów. Nie oddaje wszystkich barw widzianych przez ludzkie oko, np. purpury.
H oznacza 'hue’ czyli 'odcień’, 'barwa’ i jest podawany w postaci kąta 0.0 – 360.0o. Barwy zielone mieszczą się w zakresie od 0.0 do 120.0. Barwy niebieskie mieszczą się w przedziale od 120.0 do 240.0, a barwy czerwone od 240.0 do 360.0
S oznacza 'saturation’, czyli 'nasycenie’ koloru podawane w zakresie 0.0 – 100%
L oznacza 'lightness’ czyli 'jasność’, podawane w zakresie 0.0 – 100%
HSLA dodaje czwarty parametr – 'krycie’ wyrażony w zakresie od 0.0 do 1.0.
W HTML hue można podawać w postaci 6 kolorów nazwanych i ich 6 odcieni, ale ten sposób nie działa w canvas.
Palety kolorów HSL:
Przeliczanie RGB na HSL
Listing
//Przyjmuje wartości RGB
//zwraca tablicę HSL (h w stopniach od 0.0 - 360, pozostałe
//w %)
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 sm = max + min;
var h = sm / 2;
var s = sm / 2;
var l = sm / 2;
if(max == min){
h = s = 0; // achromatic
}else{
var d = max - min;
s = l > 0.5 ? d / (2 - sm) : d / sm;
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 *= 60.0;
}
return [roundToDecimal(h,4), roundToDecimal(s,4), roundToDecimal(l,4)];
}
Przeliczanie HSL na RGB
Listing
//h - barwa w stopniach 0.0 - 360.0
//s - nasycenie w % od 0.0 - 100%
//l - jasność w % od 0.0 - 100%
//zwraca tablice wartości RGB
function HSLToRGB(h, s, l) {
var r, g, b;
h /= 360.0;
if (s == 0) {
r = g = b = l; // achromatic
} else {
var q = l 7lt; 0.5 ? l * (1 + s) : l + s - l * s;
var p = 2 * l - q;
r = HueToRGB(p, q, h + 1.0 / 3.0);
g = HueToRGB(p, q, h);
b = HueToRGB(p, q, h - 1.0 / 3.0);
}
return [ roundToDecimal(r * 255, 0), roundToDecimal(g * 255, 0),
roundToDecimal(b * 255, 0) ];
}
//funkcja pomocnicza do obliczania nasycenia
function HueToRGB(a, b, c) {
if (c < 0)
c += 1;
if (c > 1)
c -= 1;
if (c < 1.0 / 6.0)
return a + (b - a) * 6 * c;
if (c < 1.0 / 2.0)
return b;
if (c < 2.0 / 3.0)
return a + (b - a) * (2. / 3.0 - c) * 6;
return a;
}
Listing
var cv = document.getElementById("canvas");
var ctx = cv.getContext("2d");
var cv = document.getElementById("canvas");
var ctx = cv.getContext("2d");
ctx.beginPath();
ctx.fillStyle = "hsl(0,100%,50%)";
ctx.fillRect(10, 10, 30, 30);
ctx.fillStyle = "black";
ctx.fillText("hsl(0, 100%, 50%)", 60, 25);
ctx.beginPath();
ctx.fillStyle = "hsl(110,100%,50%)";
ctx.fillRect(10, 50, 30, 30);
ctx.fillStyle = "black";
ctx.fillText("hsl(110, 100%, 50%)", 60, 65);
ctx.beginPath();
ctx.fillStyle = "hsl(250,100%,50%)";
ctx.fillRect(10, 90, 30, 30);
ctx.fillStyle = "black";
ctx.fillText("hsl(250, 100%, 50%)", 60, 105);
