html5 canvas圖像轉換成數組
html5的canvas可以進行圖片處理,圖片是由像素組成的。我們知道canvas有方法getImageData,返回的對象中可以取出,image的data 數組(類似數組的Type Array類型數組,Uint8ClampedArray)。
假設canvas寬高是500*400,那么應該有200000個像素點,而通過getImageData().data獲取的data數組的length是800000。我們還知道rgba表示顏色的方法,r=red,g=green,b=blue,a=alpha;即紅綠藍三原色和透明值。
所以這個data數組是每四個數組值代表一個像素點。這樣一來,一個圖像就轉化成了數據表示的數組。如下面的代碼:
var canvas = document.getElementById('canvas'); var ctxt = canvas.getContext('2d'); var img = new Image; img.onload = function(){ ctxt.drawImage(img, 0, 0); var data = ctxt.getImageData(0, 0, 480, 480).data; console.log(data, data.toString()); } img.src = 'img/pic.jpg';
圖像數組的遍歷
如上面的代碼,我們可以看到數組data就是圖片轉換成的數組,那么遍歷這個數組就可以取得圖片的像素點內容:
var data = ctxt.getImageData(0, 0, 480, 480).data; for(var i =0,len = data.length; i<len;i+=4){ var red = data[i], green = data[i+1], blue = data[i+2], alpha = data[i+3]; }
圖片顏色反轉
顏色反轉的算法就是三原色求反,即255-原色。所以有了下面的方法:
function draw(img){ ctxt.clearRect(0, 0, 480, 480); // console.log(img); ctxt.putImageData(img,0,0); } function invert(){ var back = ctxt.createImageData(480, 480); var arr = back.data; for(var i=0,len = data.length;i<len;i+=4){ var red = data[i], green = data[i+1], blue = data[i+2], alpha = data[i+3]; arr[i] = 255-red; arr[i+1] = 255-green; arr[i+2] = 255-blue; arr[i+3] = alpha; } return back; } //顏色反轉 draw(invert());
顏色一些算法
去色:把圖片變成黑白圖,只要把每個像素的R、G、B設為亮度(Y)的值就行了。關于R、G、B、Y的關系可以看到這里看看,這里只要記住這條公式:Y = 0.299R + 0.587G + 0.114B,使用位:(R* 4899 + G * 9617 + B* 1868 + 8192) >> 14,速度會快
反相(反轉):就是將一個顏色換成它的補色。補色就是用255(8位通道模式下,255即2的8次方,16位要用65535去減,即2的16次方)減去它本身得到的值:R(補) = 255 – R。
其他算法需要基色和混合色配合可以參考:http://wenku.baidu.com/view/275f9c4769eae009581bec56.html