three.js 將圖片馬賽克化的示例代碼
這篇郭先生來(lái)說(shuō)說(shuō)BufferGeometry,類(lèi)型化數(shù)組和粒子系統(tǒng)的使用,并且讓圖片有馬賽克效果(同理可以讓不清晰的圖片清晰化),如圖所示

1. 解析圖片
解析圖片和上一篇一樣
initCanvas() {
canvas = document.createElement('canvas');
content = canvas.getContext('2d');
canvas.width = 1600;
canvas.height = 1200;
img = new Image();
img.crossOrigin = '*';
img.src = "/static/images/base/girl.jpg";
img.onload = () => {
content.drawImage(img, 0, 0, canvas.width, canvas.height);
imgDate = content.getImageData(0, 0, canvas.width, canvas.height);
this.createPotCloud(); //創(chuàng)建點(diǎn)云
};
}
2. 操作像素點(diǎn)
createPotCloud() {
if (points) {
scene.remove(points)
}
let cw = Math.floor(canvas.width / size);
let ch = Math.floor(canvas.height / size);
particles = cw * ch;
geometry = new THREE.BufferGeometry();
positions = new Float32Array(Math.floor(particles * 3));
positions_af = new Float32Array(Math.floor(particles * 3));
var colors = new Float32Array(Math.floor(particles * 3));
for (var i = 0; i < positions.length; i += 1) {
positions[3 * i] = - canvas.width / 2 + (i % cw) * size;
positions[3 * i + 1] = canvas.height / 2 + Math.floor((-1 - i) / cw) * size;
positions[3 * i + 2] = 0;
let selectPos = size * (i % cw) + Math.floor(i / cw) * cw * size * size;
colors[3 * i] = imgDate.data[4 * selectPos] / 255.0;
colors[3 * i + 1] = imgDate.data[4 * selectPos + 1] / 255.0;
colors[3 * i + 2] = imgDate.data[4 * selectPos + 2] / 255.0;
}
geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3))
geometry.dynamic = true;
geometry.attributes.position.needsUpdate = true;
var material = new THREE.PointsMaterial({ size: size, vertexColors: THREE.VertexColors })
points = new THREE.Points(geometry, material);
points.name = 'points';
scene.add(points);
loaded = true;
},
可以不用糾結(jié)代碼,核心思想其實(shí)我們只需要每隔一定的顏色點(diǎn)取出一個(gè)顏色點(diǎn),然后將這個(gè)顏色賦予到geometry的color屬性上,就可以了,也可以每隔兩行、兩列取一個(gè)點(diǎn),但是圖片上面的點(diǎn)是一維的,所以需要一些數(shù)學(xué)方法,

如圖所示,原理很簡(jiǎn)單哦。將不清晰的圖片清晰化,就是需要插入更多的像素點(diǎn),插入的像素點(diǎn),需要根據(jù)已存在的像素點(diǎn)的顏色進(jìn)行插值,比如原圖的像素點(diǎn)1為0xffffff,像素點(diǎn)2的顏色為0xdddddd,則插在兩個(gè)像素點(diǎn)之間像素點(diǎn)的顏色為0xeeeeee,以此類(lèi)推。
以上就是three.js 將圖片馬賽克化的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于three.js 將圖片馬賽克化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- three.js如何實(shí)現(xiàn)3D動(dòng)態(tài)文字效果
- three.js 實(shí)現(xiàn)露珠滴落動(dòng)畫(huà)效果的示例代碼
- three.js中多線程的使用及性能測(cè)試詳解
- three.js顯示中文字體與tween應(yīng)用詳析
- 微信小游戲中three.js離屏畫(huà)布的示例代碼
- three.js 利用uv和ThreeBSP制作一個(gè)快遞柜功能
- three.js著色器材質(zhì)的內(nèi)置變量示例詳解
- vue頁(yè)面引入three.js實(shí)現(xiàn)3d動(dòng)畫(huà)場(chǎng)景操作
- three.js 制作動(dòng)態(tài)二維碼的示例代碼
- 如何用threejs實(shí)現(xiàn)實(shí)時(shí)多邊形折射
相關(guān)文章
JavaScript+CSS實(shí)現(xiàn)仿天貓側(cè)邊網(wǎng)頁(yè)菜單效果
這篇文章主要介紹了JavaScript+CSS實(shí)現(xiàn)仿天貓側(cè)邊網(wǎng)頁(yè)菜單效果,涉及javascript鼠標(biāo)事件及頁(yè)面元素動(dòng)態(tài)操作的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
用js提交表單解決一個(gè)頁(yè)面有多個(gè)提交按鈕的問(wèn)題
這篇文章主要介紹了用js提交表單解決一個(gè)頁(yè)面有多個(gè)提交按鈕的問(wèn)題,主要是判斷是否為提交文本,然后再執(zhí)行相應(yīng)的動(dòng)作,需要的朋友可以參考下2014-09-09
JavaScript之Canvas_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了JavaScript之Canvas,Canvas是HTML5新增的組件,它就像一塊幕布,可以用JavaScript在上面繪制各種圖表、動(dòng)畫(huà)等2017-07-07
js實(shí)現(xiàn)右下角可關(guān)閉最小化div(可用于展示推薦內(nèi)容)
使用Javascript實(shí)現(xiàn)右下角可關(guān)閉最小化div,可以用于展示推薦內(nèi)容,完整源代碼如下,感興趣的各位可以參下哈,希望對(duì)大家有所幫助2013-06-06
javascript隨機(jī)將第一個(gè)dom中的圖片添加到第二個(gè)div中示例
此代碼的是一個(gè)簡(jiǎn)單的例子,將第一個(gè)div中的五張圖片中,提取隨機(jī)兩張顯示到第二個(gè)div中,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下2013-10-10
在CSS里寫(xiě)復(fù)雜的JavaScript腳本
在IE下,CSS里可以寫(xiě)入JavaScript腳本,不過(guò),要用expression套住. 雖然可以這樣,但是由于是在CSS里,這個(gè)特殊地方,所以,不能寫(xiě)成如下這樣: width:expression(if(...){}else{...})2008-04-04
JS大坑之19位數(shù)的Number型精度丟失問(wèn)題詳解
這篇文章主要介紹了JS大坑之19位數(shù)的Number型精度丟失問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
ExpressJS使用express-ws的實(shí)例詳解
這篇文章主要介紹了ExpressJS使用express-ws的實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09

