最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2012年12月27日 09:32:25   作者:  
上一篇文章,我們定義了矩陣,這篇文章我們來給矩陣添加一些常用方法比如:toString方法、clone方法等,需要了解的朋友可以詳細參考下
前言
上一篇文章,我們定義了矩陣,這篇文章我們來給矩陣添加一些常用方法。

toString方法
toString方法通常用作將對象轉(zhuǎn)成字符串描述,所以我們將這一方法定義為輸出矩陣元素。
復(fù)制代碼 代碼如下:

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;
};

這樣,我們就可以通過:
復(fù)制代碼 代碼如下:

console.log(mat);

來輸出矩陣了。

clone方法
實際上,我們可以通過構(gòu)造函數(shù)進行克隆操作,不過依然提供一個方法來方便記憶、使用。
復(fù)制代碼 代碼如下:

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):
復(fù)制代碼 代碼如下:

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);
break;
case "float":
return new Float32Array(this.buffer, (y * rowLen + x * 4), len);
break;
case "doulble":
return new Float64Array(this.buffer, (y * rowLen + x * 8), len);
break;
default:
console.error("不支持數(shù)據(jù)類型");
}
};

如果你對ArrayBuffer和TypedArray還不太清楚,可以參考:HTML5 中的新數(shù)組。
String type - 需要返回的數(shù)據(jù)類型。支持:
uchar 無符號8位整數(shù)
short 有符號16位整數(shù)
int 有符號32位整數(shù)
float 有符號32位浮點數(shù)
double 有符號64位浮點數(shù)

Vec 向量形式
向量形式字符串拼寫是:Vec + (類型)+ (個數(shù)),例如Vecb4就是4個無符號8位整數(shù),這是常見的得到一個像素點數(shù)據(jù)的方法,例如為了得到mat第j行,第k列的像素數(shù)據(jù),可以使用:
復(fù)制代碼 代碼如下:

mat.at("Vecb4", j, k);

int x - 要獲取的元素在矩陣的行數(shù)。
int y - 要獲取的元素在矩陣的列數(shù)。

getRow方法和getCol方法
類似于at的實現(xiàn)方法,我們可以很容易寫出獲取某一行或者某一列的方法:
復(fù)制代碼 代碼如下:

Mat.prototype.getRow = function(__i){
var len = this.col * this.channel,
rowLen = len * this.bytes,
i = __i || 0;
return new this.data.constructor(this.buffer, i * rowLen, len);
};

復(fù)制代碼 代碼如下:

Mat.prototype.getCol = function(__i){
var len = this.col * this.channel,
rowLen = len * this.bytes,
array = [],
i = __i || 0;
function getAllElement(__constructor){
var row = this.row,
channel = this.channel;
for(var j = 0; j < row; j++){
array.push(new __constructor(this.buffer, j * rowLen + i, 1 * channel));
}
}
getAllElement(this.data.constructor);
return array;
};

rowRange和colRange方法
類似的,我們也可以得到指定行和指定列的方法:
復(fù)制代碼 代碼如下:

Mat.prototype.rowRange = function(__i, __j){
var len = this.col * this.channel,
rowLen = len * this.bytes,
array = [],
i = __i || 0,
j = __j || this.row;
function getAllElement(__constructor){
var row = this.row;
for(var k = i; k <= j; k++){
array.push(new __constructor(this.buffer, k * rowLen, len));
}
}
getAllElement(this.data.constructor);
return array;
};

復(fù)制代碼 代碼如下:

Mat.prototype.colRange = function(__i, __j){
var len = this.col * this.channel,
rowLen = len * this.bytes,
array = [],
i = __i || 0,
j = __j || this.col;
function getAllElement(__constructor){
var row = this.row
channel = this.channel;
for(var k = 0; k < row; k++){
array.push(new __constructor(this.buffer, k * rowLen + __i, (__j - __i + 1) * channel));
}
}
getAllElement(Float64Array);
return array;
};

這四種方法返回的都是一種Array<TypedArray>的數(shù)組。如果要獲取這個數(shù)組rect第j行,第k列的元素,則可用:
rect[j][k]

相關(guān)文章

  • 極致之美——百行代碼實現(xiàn)全新智能語言

    極致之美——百行代碼實現(xiàn)全新智能語言

    極致之美——百行代碼實現(xiàn)全新智能語言...
    2007-03-03
  • js實現(xiàn)鼠標(biāo)切換圖片(無定時器)

    js實現(xiàn)鼠標(biāo)切換圖片(無定時器)

    這篇文章主要為大家詳細介紹了js實現(xiàn)鼠標(biāo)切換圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 再談javascript原型繼承

    再談javascript原型繼承

    Javascript原型繼承是一個被說爛掉了的話題,但是自己對于這個問題一直沒有徹底理解,今天花了點時間又看了一遍《Javascript模式》中關(guān)于原型實現(xiàn)繼承的幾種方法,下面來一一說明下,在最后我根據(jù)自己的理解提出了一個關(guān)于繼承比較完整的實現(xiàn)。
    2014-11-11
  • 微信小程序movable view移動圖片和雙指縮放實例代碼

    微信小程序movable view移動圖片和雙指縮放實例代碼

    movable-area是微信小程序的新組件,可以用來移動視圖區(qū)域movable-view。這篇文章主要介紹了微信小程序movable view移動圖片和雙指縮放實例代碼,需要的朋友可以參考下
    2017-08-08
  • 純前端導(dǎo)出txt文本文件具體流程

    純前端導(dǎo)出txt文本文件具體流程

    TXT作為純文本格式,只支持無格式的文本內(nèi)容,不包括任何樣式信息,下面這篇文章主要給大家介紹了關(guān)于純前端導(dǎo)出txt文本文件的相關(guān)資料,文中給出了詳細的代碼示例,需要的朋友可以參考下
    2024-08-08
  • document節(jié)點對象的獲取方式示例介紹

    document節(jié)點對象的獲取方式示例介紹

    如果要操作一個元素,首先要獲取到它,下面為大家介紹下document節(jié)點對象的獲取方式,感興趣的朋友不要錯過
    2013-12-12
  • javascript html5 canvas實現(xiàn)可拖動省份的中國地圖

    javascript html5 canvas實現(xiàn)可拖動省份的中國地圖

    這篇文章主要介紹了javascript html5 canvas實現(xiàn)可拖動省份的中國地圖的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • 原生js實現(xiàn)淘寶放大鏡效果

    原生js實現(xiàn)淘寶放大鏡效果

    這篇文章主要為大家詳細介紹了原生js實現(xiàn)放大鏡效果,制作一個類似于淘寶的放大鏡效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 一文搞懂JavaScript中原型與原型鏈

    一文搞懂JavaScript中原型與原型鏈

    js中的原型與原型鏈應(yīng)該是老生常談的話題了,在前端面試中基本都是必問的一個問題,但是很多人還是稀里糊涂的,只知道其表層含義。本文將帶大家深入了解JavaScript中的原型與原型鏈,感興趣的可以學(xué)習(xí)一下
    2022-10-10
  • js實現(xiàn)web留言板功能

    js實現(xiàn)web留言板功能

    這篇文章主要為大家詳細介紹了js實現(xiàn)web留言板功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論

伽师县| 泗洪县| 湘潭县| 富民县| 新沂市| 陆良县| 卫辉市| 惠安县| 扶沟县| 灵台县| 罗源县| 北海市| 甘德县| 竹山县| 定州市| 游戏| 宁化县| 墨竹工卡县| 鹰潭市| 永登县| 阿拉善盟| 茂名市| 湖州市| 东丰县| 大化| 沾化县| 遂川县| 元阳县| 大方县| 富源县| 萍乡市| 尼木县| 明溪县| 依安县| 抚松县| 博罗县| 垦利县| 临泉县| 聂荣县| 怀安县| 平武县|