html5 canvas圖像轉(zhuǎn)換成數(shù)組
html5的canvas可以進(jìn)行圖片處理,圖片是由像素組成的。我們知道canvas有方法getImageData,返回的對(duì)象中可以取出,image的data 數(shù)組(類似數(shù)組的Type Array類型數(shù)組,Uint8ClampedArray)。
假設(shè)canvas寬高是500*400,那么應(yīng)該有200000個(gè)像素點(diǎn),而通過getImageData().data獲取的data數(shù)組的length是800000。我們還知道rgba表示顏色的方法,r=red,g=green,b=blue,a=alpha;即紅綠藍(lán)三原色和透明值。
所以這個(gè)data數(shù)組是每四個(gè)數(shù)組值代表一個(gè)像素點(diǎn)。這樣一來,一個(gè)圖像就轉(zhuǎn)化成了數(shù)據(jù)表示的數(shù)組。如下面的代碼:
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';
圖像數(shù)組的遍歷
如上面的代碼,我們可以看到數(shù)組data就是圖片轉(zhuǎn)換成的數(shù)組,那么遍歷這個(gè)數(shù)組就可以取得圖片的像素點(diǎn)內(nèi)容:
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];
}
圖片顏色反轉(zhuǎn)
顏色反轉(zhuǎn)的算法就是三原色求反,即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;
}
//顏色反轉(zhuǎn)
draw(invert());
顏色一些算法
去色:把圖片變成黑白圖,只要把每個(gè)像素的R、G、B設(shè)為亮度(Y)的值就行了。關(guān)于R、G、B、Y的關(guān)系可以看到這里看看,這里只要記住這條公式:Y = 0.299R + 0.587G + 0.114B,使用位:(R* 4899 + G * 9617 + B* 1868 + 8192) >> 14,速度會(huì)快
反相(反轉(zhuǎn)):就是將一個(gè)顏色換成它的補(bǔ)色。補(bǔ)色就是用255(8位通道模式下,255即2的8次方,16位要用65535去減,即2的16次方)減去它本身得到的值:R(補(bǔ)) = 255 – R。
其他算法需要基色和混合色配合可以參考:http://wenku.baidu.com/view/275f9c4769eae009581bec56.html
