canvas學習筆記八 畫素操作

2022-02-25 05:45:56 字數 2646 閱讀 9326

imagedata物件包含了乙個區域內的canvas的畫素資訊。它包含以下可讀屬性:

width

canvas的寬度,單位是畫素。

height

canvas的高度,單位是畫素。

data

乙個uint8clampedarray的一維陣列,包含了每個畫素的rgba值。

什麼是uint8clampedarray?這個陣列裡的數值是8位的整型,而且值得範圍在0和255之間。任何不在[0, 255]之間的數都會變成[0, 255]之間最接近的那個整型數。

0到255之間,那記錄的自然是rgba顏色數值啦。這個data陣列是這樣排列的,data[0]是第一排第一列的畫素r通道的數值,data[1]第一排第一列的畫素g通道的數值,data[3]是第一排第一列的畫素的alpha通道的數值。而data[4]是第一排第二列的畫素的r通道數值,以此類推。

比如說,第50排第200列的畫素的藍色通道的值:

bluecomponent = imagedata.data[((50 * (imagedata.width * 4)) + (200 * 4)) + 2];

另外,data也有length屬性,就是data陣列的長度。

有兩種方法建立imagedata:

var myimagedata = ctx.createimagedata(width, height);

var myimagedata = ctx.createimagedata(anotherimagedata);

注意啦,方法二是不會把data屬性複製過去的,僅僅是複製了寬度和高度,data陣列裡的畫素資訊都是透明黑的,也就是都是0。

可以用getimagedata()方法獲取畫素資訊。

var myimagedata = ctx.getimagedata(left, top, width, height);

top和left就是所擷取的畫布部分的左上角座標。

tip:

超過畫布區域返回的畫素資訊都是透明黑,也就是都是0。

var img = new image();

img.src = '';

var canvas = document.getelementbyid('canvas');

var ctx = canvas.getcontext('2d');

img.onload = function() ;

var color = document.getelementbyid('color');

function pick(event)

canvas.addeventlistener('mousemove', pick);

滑鼠滑過就會顯示rgba值。

ctx.putimagedata(myimagedata, dx, dy);

這個方法可以傳入乙個imagedata物件,然後把imagedata物件中的畫素資訊都畫出來。dx, dy是繪製的左上角座標。

比如我們可以逐一改變imagedata物件中的值,從而改變了整個圖象的顏色,再把它畫出來。

這有什麼用呢?對於要對畫素進行的操作來說,這很方便。比如反色、去色等操作。

var img = new image();

img.src = '';

img.onload = function() ;

function draw(img)

ctx.putimagedata(imagedata, 0, 0);

};var grayscale = function()

ctx.putimagedata(imagedata, 0, 0);

};var invertbtn = document.getelementbyid('invertbtn');

invertbtn.addeventlistener('click', invert);

var grayscalebtn = document.getelementbyid('grayscalebtn');

grayscalebtn.addeventlistener('click', grayscale);

}

invert()反色函式將rgb通道的值用255減去,grayscale()去色函式將rgb通道的值進行平均,從而使顏色變成灰色。

點選grayscale按鈕會變成灰色,點選invert按鈕會反色。

可以把**放進codepen裡看看效果如何。

canvas.todataurl('image/png')

預設轉換成的格式是png。

canvas.todataurl('image/jpeg', quality)

也可以是別的格式。quality是品質,數值是0~1。0是最差的品質,1是最佳的品質。

也可以生成二進位制物件:

canvas.toblob(callback, type, encoderoptions)

canvas畫素操作

獲得乙個包含畫布場景畫素資料的imagedata對像,它代表了畫布區域的物件資料 ctx.getimagedata sx,sy,sw,sh sx 將要被提取的影象資料矩形區域的左上角 x 座標。sy 將要被提取的影象資料矩形區域的左上角 y 座標。sw 將要被提取的影象資料矩形區域的寬度。sh 將要...

canvas畫素的操作

在canvas中的畫素操作 到目前為止,我們尚未深入了解canvas畫布真實畫素的原理,事實上,你可以直接通過imagedata物件操縱畫素資料,直接讀取或將資料陣列寫入該物件中 得到場景畫素資料 getimagedata 獲得乙個包含畫布場景畫素資料的imagedata對像,它代表了畫布區域的物件...

canvas畫素操作函式封裝

傳入乙個imagedata物件,x軸的座標,y軸的座標 function getpxinfo imgdata,x,y 獲取某個畫素呼叫函式 示例 var imgdata ctx.getimagedata 0,0,canvas.width,canvas.height 獲取 49,49 的畫素的rgba...