{"id":243,"date":"2012-11-15T20:20:29","date_gmt":"2012-11-15T18:20:29","guid":{"rendered":"http:\/\/webowiec.net\/blog\/?p=243"},"modified":"2015-04-08T08:56:52","modified_gmt":"2015-04-08T06:56:52","slug":"canvas-javascript-gradient-hsv","status":"publish","type":"post","link":"https:\/\/webowiec.net\/blog\/canvas-javascript-gradient-hsv\/","title":{"rendered":"[canvas][javascript] Gradient HSV &#8211; pe\u0142en zakres kolor\u00f3w"},"content":{"rendered":"<p><a href=\"https:\/\/webowiec.net\/blog\/wp-content\/uploads\/2012\/11\/Zaznaczenie_004.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webowiec.net\/blog\/wp-content\/uploads\/2012\/11\/Zaznaczenie_004.png\" alt=\"Zaznaczenie_004\" width=\"352\" height=\"98\" class=\"aligncenter size-full wp-image-456\" srcset=\"https:\/\/webowiec.net\/blog\/wp-content\/uploads\/2012\/11\/Zaznaczenie_004.png 352w, https:\/\/webowiec.net\/blog\/wp-content\/uploads\/2012\/11\/Zaznaczenie_004-300x84.png 300w\" sizes=\"auto, (max-width: 352px) 100vw, 352px\" \/><\/a><br \/>\nModel HSV nawi\u0105zuje do sposobu, w jakim widzi ludzki narz\u0105d wzroku, gdzie wszystkie barwy postrzegane s\u0105 jako \u015bwiat\u0142o pochodz\u0105ce z o\u015bwietlenia. Wed\u0142ug tego modelu wszelkie barwy wywodz\u0105 si\u0119 ze \u015bwiat\u0142a bia\u0142ego, gdzie cz\u0119\u015b\u0107 widma zostaje wch\u0142oni\u0119ta a cz\u0119\u015b\u0107 odbita od o\u015bwietlanych przedmiot\u00f3w.<\/p>\n<p>H \u2013 odcie\u0144 \u015bwiat\u0142a (ang. Hue) wyra\u017cona k\u0105tem na kole barw przyjmuj\u0105ca warto\u015bci od 0\u00b0 do 360\u00b0;<br \/>\nS \u2013 nasycenie koloru jako promie\u0144 podstawy (warto\u015bci od 0 do 1);<br \/>\nV \u2013 moc \u015bwiat\u0142a bia\u0142ego (warto\u015bci od 0 do 1)<\/p>\n<p>Tyle teorii, <strong>jak narysowa\u0107 pe\u0142en zakres kolor\u00f3w HSV (t\u0119cza) w CANVAS?<\/strong><br \/>\n<!--more--><\/p>\n<p>W pierwszej kolejno\u015bci potrzebna nam b\u0119dzie funkcja zamieniaj\u0105ca kolor HSV na RGB, kt\u00f3ry mo\u017ce by\u0107 u\u017cyty w generowaniu grafiki (javascript &#8220;nie rozumie&#8221; kolor\u00f3w w formacie HSV):<\/p>\n<p>[php]<br \/>\n&lt;script type=&quot;text\/javascript&quot;&gt;<br \/>\nfunction hsvToRgb(h, s, v){<br \/>\n    var r, g, b;<br \/>\n\u00a0 \u00a0 if (s == 0){<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 r = v;g = v;b = v;<br \/>\n    \treturn {r:Math.round(r * 255), g:Math.round(g * 255), b:Math.round(b * 255)};<br \/>\n\u00a0 \u00a0 }<br \/>\n\u00a0 \u00a0 h \/= 60;<br \/>\n\u00a0 \u00a0 var i \u00a0= Math.floor(h);<br \/>\n\u00a0 \u00a0 var f = h &#8211; i;<br \/>\n\u00a0 \u00a0 var p = v * \u00a0(1 &#8211; s);<br \/>\n\u00a0 \u00a0 var q = v * (1 &#8211; s * f);<br \/>\n\u00a0 \u00a0 var t = v * (1 &#8211; s * (1 &#8211; f));<br \/>\n\u00a0 \u00a0 switch( i ) {<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 case 0:  r = v; \u00a0 g = t;  \u00a0 b = p;  break;<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 case 1: \u00a0 r = q;  g = v;  b = p;  break;<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 case 2: \u00a0 r = p;  \u00a0 g = v; \u00a0 b = t;  break;<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 case 3: \u00a0 r = p;  \u00a0 g = q;  b = v; \u00a0 break;<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 case 4: \u00a0 r = t;   g = p;  \u00a0 b = v;  break;<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 default:\u00a0 \u00a0 r = v;  g = p;  b = q; \u00a0 break;<br \/>\n\u00a0 \u00a0 }<br \/>\n    return {r:Math.round(r * 255), g:Math.round(g * 255), b:Math.round(b * 255)};<br \/>\n}\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n&lt;\/script&gt;<br \/>\n[\/php]<\/p>\n<p>Czas przygotowa\u0107 obszar roboczy &#8211; np. o <strong>wymiarach 360 x 100 px<\/strong>, tak aby ka\u017cda barwa (stopnie\u0144 obrotu &#8211; warto\u015b\u0107 H) mia\u0142a swoj\u0105 reprezentacje na grafice. Nast\u0119pnie w p\u0119tli przegl\u0105damy wszystkie kolory HSV zgodnie z zasad\u0105:<br \/>\nH &#8211; od 0 do 360<br \/>\nS = 1<br \/>\nV = 1<\/p>\n<p>Tak wi\u0119c p\u0119tla b\u0119dzie mie\u0107 360 iteracji a w ka\u017cdej b\u0119dzie generowany kolor RGB odpowiadaj\u0105cy kolejnym stopniom (parametr H) koloru HSV.<\/p>\n<p>Do rysowania kolor\u00f3w wykorzystamy standardow\u0105 funkcj\u0119 <strong>CANVAS &#8211; createLinearGradient<\/strong>, co pozwoli ograniczy\u0107 liczb\u0119 operacji w p\u0119tli z 360 do 72 &#8211; pr\u00f3bkowanie koloru b\u0119dzie nast\u0119powa\u0107 co 5 pikseli, pozosta\u0142e miejsce wype\u0142ni za nas funkcja, tworz\u0105c gradient.<\/p>\n<p>[php]<br \/>\n&lt;canvas id=&quot;bitmap&quot; width=&quot;360&quot; height=&quot;100&quot;&gt;brak obslugi canvas&lt;\/canvas&gt;<br \/>\n&lt;script type=&quot;text\/javascript&quot;&gt;<br \/>\nvar bitmap = document.getElementById(&#8216;bitmap&#8217;);<br \/>\nif ( ! bitmap.getContext) { alert(&#8216;brak obslugi getContent&#8217;); return false; }<br \/>\nvar c = bitmap.getContext(&#8216;2d&#8217;);<br \/>\nvar rgb;<br \/>\nc.beginPath(); \/\/1<br \/>\ngrad = c.createLinearGradient(0, 0, 360, 0); \/\/ 1<br \/>\nfor (i=0;i&lt;=360;i+=5) {<br \/>\n\trgb = hsvToRgb(i, 1, 1);<br \/>\n\tgrad.addColorStop(i\/360, &quot;rgb(&quot;+rgb.r+&quot;, &quot;+rgb.g+&quot;,&quot;+rgb.b+&quot;)&quot;);<br \/>\n}<br \/>\nc.fillStyle = grad;<br \/>\nc.fillRect(0, 0, 360, 100);<br \/>\nc.stroke(); \/\/1<br \/>\n&lt;\/script&gt;<br \/>\n[\/php]<\/p>\n<p>Rezultat:<\/p>\n<div class=\"text-center center-block\">\n    <canvas id=\"bitmap\" width=\"360\" height=\"100\" style=\"max-width:100%;\">brak obslugi canvas<\/canvas>\n<\/div>\n<p><script type=\"text\/javascript\">\n    function hsvToRgb(h, s, v) {\n        var r, g, b;\n        console.log(h, s, v);\n        if (s == 0) {\n            r = v;\n            g = v;\n            b = v;\n            return {r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255)};\n        }\n        h \/= 60;\n        var i = Math.floor(h);\n        var f = h - i;\n        var p = v * (1 - s);\n        var q = v * (1 - s * f);\n        var t = v * (1 - s * (1 - f));\n        switch (i) {\n            case 0:\n                r = v;\n                g = t;\n                b = p;\n                break;\n            case 1:\n                r = q;\n                g = v;\n                b = p;\n                break;\n            case 2:\n                r = p;\n                g = v;\n                b = t;\n                break;\n            case 3:\n                r = p;\n                g = q;\n                b = v;\n                break;\n            case 4:\n                r = t;\n                g = p;\n                b = v;\n                break;\n            default:\n                r = v;\n                g = p;\n                b = q;\n                break;\n        }\n        return {r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255)};\n    }\/\/--------------------------------\n    var bitmap = document.getElementById('bitmap');\n    if (!bitmap.getContext) {\n        alert('brak obslugi getContent');\n    }\n    var c = bitmap.getContext('2d');\n    var rgb;\n    c.beginPath(); \/\/1\n    grad = c.createLinearGradient(0, 0, 360, 0); \/\/ 1\n    for (i = 0; i <= 360; i += 5) {\n        rgb = hsvToRgb(i, 1, 1);\n        grad.addColorStop(i \/ 360, \"rgb(\" + rgb.r + \", \" + rgb.g + \",\" + rgb.b + \")\");\n    }\n    c.fillStyle = grad;\n    c.fillRect(0, 0, 360, 100);\n    c.stroke(); \/\/1\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Model HSV nawi\u0105zuje do sposobu, w jakim widzi ludzki narz\u0105d wzroku, gdzie wszystkie barwy postrzegane s\u0105 jako \u015bwiat\u0142o pochodz\u0105ce z o\u015bwietlenia. Wed\u0142ug tego modelu wszelkie barwy wywodz\u0105 si\u0119 ze \u015bwiat\u0142a bia\u0142ego, gdzie cz\u0119\u015b\u0107 widma zostaje wch\u0142oni\u0119ta a cz\u0119\u015b\u0107 odbita od &hellip; <a href=\"https:\/\/webowiec.net\/blog\/canvas-javascript-gradient-hsv\/\" class=\"btn btn-sm btn-primary\"><i class=\"glyphicon glyphicon-link\"><\/i> Czytaj ca\u0142o\u015b\u0107<\/a><\/p>\n","protected":false},"author":4,"featured_media":456,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,437,5,3,421,24,6],"tags":[458,453,438,462,461,450,466,454,456,455,452,451,464,268,447,441,443,448,465,459,444,442,460,440,445,55,449,446,457,10,9,8,7,463],"class_list":["post-243","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to","category-javascript-2","category-poradniki","category-porady-dla-webmasterow","category-programowanie","category-technologieinformatyka","category-tourtale","tag-beginpath","tag-bitmap","tag-canvas","tag-canvas-gradient-kilka-kolorow","tag-canvas-gradient-z-wielu-kolorow","tag-canvas-javascript","tag-canvas-tecza","tag-createlineargradient","tag-fillrect","tag-fillstyle","tag-getcontext","tag-gradient-hsv","tag-gradient-tecza-canvas","tag-grafika-2","tag-grafika-canvas","tag-hsv","tag-hsv-to-rgb-javascript","tag-javascript-canvas","tag-javascript-gradient","tag-javascript-gradient-wielokolorowy","tag-javascript-siatka-hsv","tag-konwersja-kolorow","tag-multigradient-canvas","tag-pelen-zakres-kolorow-hsv","tag-piramida-hsv","tag-robienie-www","tag-rysowanie-w-jaascript","tag-stozek-hsv","tag-stroke","tag-strony-internetowe","tag-tworzenie-stron-www","tag-webmaster","tag-webowiec","tag-wiele-barw-canvas-gradient"],"_links":{"self":[{"href":"https:\/\/webowiec.net\/blog\/wp-json\/wp\/v2\/posts\/243","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webowiec.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webowiec.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webowiec.net\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/webowiec.net\/blog\/wp-json\/wp\/v2\/comments?post=243"}],"version-history":[{"count":21,"href":"https:\/\/webowiec.net\/blog\/wp-json\/wp\/v2\/posts\/243\/revisions"}],"predecessor-version":[{"id":479,"href":"https:\/\/webowiec.net\/blog\/wp-json\/wp\/v2\/posts\/243\/revisions\/479"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webowiec.net\/blog\/wp-json\/wp\/v2\/media\/456"}],"wp:attachment":[{"href":"https:\/\/webowiec.net\/blog\/wp-json\/wp\/v2\/media?parent=243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webowiec.net\/blog\/wp-json\/wp\/v2\/categories?post=243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webowiec.net\/blog\/wp-json\/wp\/v2\/tags?post=243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}