前面幾天都沒有真正的瞭解canvas裡的像素,今天就來好好探討一下吧~
使用ImageData
物件,可直接對canvas裡的像素陣列資料讀(read)和寫(write)。
接下來也會了解如何使影像平面化(反鋸齒)以及如何將影像保存在canvas中。
ImageData
儲存著canvas真實的像素數據,包含以下幾個屬性:
屬性 | 描述 |
---|---|
width |
返回ImageData 物件的寬度,以像素為單位。 |
height |
返回ImageData 物件的高度。 |
data |
返回ImageData 物件的圖像數據Uint8ClampedArray ,Uint8ClampedArray 代表一維陣列包含RGBA格式。整數值介於0到255之間。 |
Uint8ClampedArray
白話一點來說就是會把物件的總像素變成一個一維陣列,包含height
×width
× 4 bytes的資料,同索引值從0到 (height×width×4)-1,而每一個像素用4個1byte值做代表分別為紅,綠,藍,透明值(也就是RGBA格式),ex:左上角的第一個像素資料就會在陣列的索引0(紅),1(綠),2(藍),3(透明)中。
也可以使用
Uint8ClampedArray.length
屬性來讀取像素的陣列大小
ex:讀取的物件綠色組成的值。從像素的第100欄、第30行,如以下:
greenComponent=imageData.data[((30 * (imageData.width * 4)) + (100 * 4)) + 1]
方法 | 描述 |
---|---|
createImageData(width, height) |
創建一個新的ImageData 物件,width 影像的寬度, |
height 影像的高度。 |
|
getImageData(left, top, width, height) |
返回ImageData 物件,物件為畫布上指定的矩形複製像素數據,width 影像的寬度,height 影像的高度,(left, top)影像在畫布中的左上角座標 |
putImageData(ImageData, dx, dy) |
把圖像數據(從指定的ImageData 物件)放回畫布上,dx 和dy 代表要放置的位置座標。 |
大家有用過chrome類似像Color Picker的extendsion嗎?
今天利用前面學到的一個方法getImageData()
來做一個很像colorpicker的東西~
滑鼠移到畫布裡的哪裡就會顯示那塊像素的顏色
codepen範例連結
pick(e){
let X=e.x ? e.x-this.canvasX:0 //取得滑鼠X位置
let Y=e.y ? e.y-this.canvasY:0 //取得滑鼠Y位置
let pixel=this.ctx.getImageData(X,Y,1,1) //取得像素資料
let data=pixel.data
this.color='rgba(' + data[0] + ',' + data[1] +',' + data[2] + ',' + (data[3] / 255) + ')' //將顏色資料綁到data裡
},
最後成果:
~如有疑問或是錯誤,歡迎不吝指教~
參考來源:
[1]https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial/Pixel_manipulation_with_canvas