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);