国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Javascript圖像處理—為矩陣添加常用方法

2024-05-06 14:20:15
字體:
供稿:網(wǎng)友
前言
上一篇文章,我們定義了矩陣,這篇文章我們來給矩陣添加一些常用方法。

toString方法
toString方法通常用作將對象轉(zhuǎn)成字符串描述,所以我們將這一方法定義為輸出矩陣元素。
代碼如下:
Mat.prototype.toString = function(){
var tempData = this.data,
text = "Mat("+ this.type +") = {/n",
num = this.col * this.channel;
for(var i = 0; i < this.row; i++){
text += "["
for(var j = 0; j < num; j++){
text += (tempData[i * num + j] + ",");
}
text += "]/n";
}
text += "}";
return text;
};

這樣,我們就可以通過:
代碼如下:
console.log(mat);

來輸出矩陣了。

clone方法
實際上,我們可以通過構(gòu)造函數(shù)進行克隆操作,不過依然提供一個方法來方便記憶、使用。
代碼如下:
Mat.prototype.clone = function(){
return new Mat(this.row, this.col, this.data);
};

獲取指定元素
我們有兩種方法獲取矩陣元素。

數(shù)組方法
由于實際上Mat是以數(shù)組形式保存數(shù)據(jù)的,而數(shù)據(jù)看起來是這樣的:
R00 G00 B00 A00 R01 G01 B01 A01 …… R0n G0n B0n A0n
R10 G10 B10 A10 R11 G11 B11 A11 …… R1n G1n B1n A1n
……
Rm0 Gm0 Bm0 Am0 Rm1 Gm1 Bm1 Am1 …… Rmn Gmn Bmn Amn
其中大寫R、G、B、A分別代表各通道的數(shù)值,而下標(biāo)第一個表示行號,第二個表示列號。即第k行,第j列的G通道數(shù)值就是Gkj。
我們很容易得到對于一個Mat類型的mat來說,第k行,第j列像素的每個元素分別是:
Rkj = mat.data[(k * mat.col + j) * 4 + 0]
Gkj = mat.data[(k * mat.col + j) * 4 + 1]
Bkj = mat.data[(k * mat.col + j) * 4 + 2]
Akj = mat.data[(k * mat.col + j) * 4 + 3]

Buffer部分引用方法
通過Buffer的部分引用,我們可以得到矩陣的部分引用,比如我們可以利用這個來獲取一個像素點的數(shù)據(jù)數(shù)組,而改變這個數(shù)組中的值,相應(yīng)的矩陣數(shù)據(jù)也會改變;再比如我們可以以其他數(shù)據(jù)類型的方式讀取數(shù)據(jù)。而這些對于普通Array是不能實現(xiàn)的。下面我們來看一下at方法的實現(xiàn):
代碼如下:
Mat.prototype.at = function(__type, __x, __y){
var type = __type,
x = __x || 0,
y = __y || 0,
rowLen = this.col * this.channel * this.bytes,
len = 1;
if(type.indexOf("Vec") > -1){
var temp = __type.match(/Vec(/d+)([a-z])/);
len = parseInt(temp[1]);
switch(temp[2]){
case "b":
type = "uchar";
break;
case "s":
type = "short";
break;
case "i":
type = "int";
break;
case "f":
type = "float";
break;
case "d":
type = "double";
break;
}
}
switch(type){
case "uchar":
return new Uint8Array(this.buffer, (y * rowLen + x), len);
break;
case "short":
return new Int16Array(this.buffer, (y * rowLen + x * 2), len);
break;
case "int":
return new Int32Array(this.buffer, (y * rowLen + x * 4), len);
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 无棣县| 军事| 平安县| 延川县| 壶关县| 麻江县| 永兴县| 三门县| 武城县| 长沙市| 建平县| 沙坪坝区| 达州市| 永济市| 斗六市| 石河子市| 临清市| 兴城市| 贺兰县| 南城县| 清苑县| 高要市| 砀山县| 延川县| 闵行区| 石屏县| 嘉义县| 常熟市| 大港区| 南木林县| 武义县| 武穴市| 广南县| 十堰市| 德州市| 淳化县| 桦甸市| 望谟县| 萨嘎县| 漾濞| 顺义区|