
สีที่อยู่ในไฟล์รูปทั่วไปจะประกอบไปด้วย 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>