04 May

การเปลี่ยนสีรูปภาพโดยใช้ HTML5 CAVAS + Jquery

cavas

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

 

สามารถ download source code ได้ที่นี่

Leave a Reply

Your email address will not be published. Required fields are marked *