สีที่อยู่ในไฟล์รูปทั่วไปจะประกอบไปด้วย 3 สี คือ red,blue,green จะมีค่าตั้งแต่ 0-255
ซึ่งเราสามารถเปลี่ยนค่าสีทั่ง 3 สีนี้ได้โดยใช้ HTML5 CAVAS บวกกับ Jquery
มาดูตัวอย่างหลังจากทำเสร็จแล้วครับ
1. เริ่มต้นจากนำ jquery เข้ามาใน html ของเราครับ ใครจะใช้แบบ local ก็ได้ครับ
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
2. slide เลือกค่าสีจะเป็น input html ใส่ id ว่า #myslider เพื่อใช้ในการ selector
<input id="myslider" max="100" min="0" type="range" value="0" />
3. html cavas ที่ใช้สำหรับแสดงผลของรูปภาพ เรากำหนด id ว่า #canvas เพื่อใช้ในการ selector
<canvas id="canvas" width="800" height=500></canvas>
4. ในส่วนของ javascript code ในการควมคุมนั้น
<script type="text/javascript"> var canvas=document.getElementById("canvas"); // select id canvas เพื่อใช้ในการควมคุม var ctx=canvas.getContext("2d"); var cw=canvas.width; // ความกว้าง canvas var ch=canvas.height; // ความยาว canvas var imgData,data,originalData; $myslider=$('#myslider'); // select id slide เพื่อใช้ในการส่งค่า $myslider.attr({min:0,max:100}).val(0); // เซ็ตค่า min,max ของ slide // ดัก event เมื่อมีการเลือน slide $myslider.on('input change',function(){ var value=parseInt($(this).val()); // ดึงค่าจาก slide มาแปลงเป็นตัวเลขด้วย parseInt HueShift(30,300,-value/100); // ส่งค่าไปให้ฟังก็ชั่น HueShift ทำงานเพื่อปรับสีรูปตามค่าที่ได้จาก slide }); var img=new Image(); // สร้าง object image img.crossOrigin='anonymous'; img.onload=start; img.src="cavas.png" // path และ ชื่อรูปที่ต้องการใช้ function start(){ cw=canvas.width=img.width; // กำหนดความกว้างรูปเท่ากับควมากว้าง cavans ch=canvas.height=img.height; // กำหนดความสูงรูปเท่ากับควมาสูง cavans ctx.drawImage(img,0,0); // render image imgData=ctx.getImageData(0,0,cw,ch); data=imgData.data; imgData1=ctx.getImageData(0,0,cw,ch); originalData=imgData1.data; } // function สำหรับเปลี่ยนค่าสี function HueShift(hue1,hue2,shift){ for(var i=0;i<data.length;i+=4){ red=originalData[i+0]; green=originalData[i+1]; blue=originalData[i+2]; alpha=originalData[i+3]; // skip transparent/semiTransparent pixels if(alpha<230){continue;} var hsl=rgbToHsl(red,green,blue); var hue=hsl.h*360; // change redish pixels to the new color if(hue<30 || hue>300){ var newRgb=hslToRgb(hsl.h+shift,hsl.s,hsl.l); data[i+0]=newRgb.r; data[i+1]=newRgb.g; data[i+2]=newRgb.b; data[i+3]=255; } } ctx.putImageData(imgData,0,0); } // function แปลงค่า rgb เป็น hsl 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 h, s, l = (max + min) / 2; if(max == min){ h = s = 0; // achromatic }else{ var d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); 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 /= 6; } return({ h:h, s:s, l:l }); } // function แปลงค่า hsl เป็น rgb function hslToRgb(h, s, l){ var r, g, b; if(s == 0){ r = g = b = l; // achromatic }else{ function hue2rgb(p, q, t){ if(t < 0) t += 1; if(t > 1) t -= 1; if(t < 1/6) return p + (q - p) * 6 * t; if(t < 1/2) return q; if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; return p; } var q = l < 0.5 ? l * (1 + s) : l + s - l * s; var p = 2 * l - q; r = hue2rgb(p, q, h + 1/3); g = hue2rgb(p, q, h); b = hue2rgb(p, q, h - 1/3); } return({ r:Math.round(r * 255), g:Math.round(g * 255), b:Math.round(b * 255), }); } </script>