2D Context API 提供了三個方法用于像素級操作:createImageData, getImageData, 和putImageData。ImageData對象保存了圖像像素值。每個對象有三個屬性: width, height 和data。data 屬性類型為CanvasPixelArray,用于儲存width*height*4個像素值。每一個像素有RGB值和透明度alpha值(其值為 0 至255,包括alpha在內(nèi)!)。像素的順序從左至右,從上到下,按行存儲。為了更好的理解其原理,讓我們來看一個例子——繪制紅色矩形 - // Create an ImageData object.
- var imgd = context.createImageData(50,50);
- var pix = imgd.data;
- // Loop over each pixel 和 set a transparent red.
- for (var i = 0; n = pix.length, i < n; i += 4)
- {
- pix[i ] = 255; // red channel
- pix[i+3] = 127; // alpha channel
- }
- // Draw the ImageData object at the given (x,y) coordinates.
- context.putImageData(imgd, 0,0);
注意: 不是所有瀏覽器都實(shí)現(xiàn)了 createImageData。在支持的瀏覽器中,需要通過 getImageData 方法獲取 ImageData 對象。請參考示例代碼。 通過 ImageData可以完成很多功能。如可以實(shí)現(xiàn)圖像濾鏡,或可以實(shí)現(xiàn)數(shù)學(xué)可視化 (如分形和其他特效)。下面特效實(shí)現(xiàn)了簡單的顏色反轉(zhuǎn)濾鏡: - // Get the CanvasPixelArray from the given coordinates and dimensions.
- var imgd = context.getImageData(x, y, width, height);
- var pix = imgd.data;
- // Loop over each pixel and invert the color.
- for (var i = 0, n = pix.length; i <n; i += 4)
- {
- pix[i ] = 255 – pix[i ]; // red
- pix[i+1] = 255 – pix[i+1]; // green
- pix[i+2] = 255 – pix[i+2]; // blue
- // i+3 is alpha (the fourth element)
- }
- // Draw the ImageData at the given (x,y) coordinates.
- context.putImageData(imgd, x, y);
|