Canvas + JavaScript 制作圖片粒子效果
首先看一下源圖和轉(zhuǎn)換成粒子效果的對比圖:
左側(cè)圖片為源圖,右側(cè)圖片為粒子效果圖。該效果是在Canvas畫布上制作的。將圖片制作成粒子效果相對而言是比較簡單的。重點(diǎn)了解兩個知識點(diǎn)即可
1:圖片是通過image對象形式繪制在畫布上的,然后使用Canvas的getImageData接口,獲取圖像的像素信息。
var imageData=ctx.getImageData(x, y, width, height);
參數(shù)說明:x,y為畫布上的x和y坐標(biāo)
width,height為獲取指定區(qū)域圖像的信息
返回值說明:imageData為返回值,它是一個對象,包含三個屬性
imageData={ data:Unit8ClampedArray[10000] //一個包含圖片區(qū)域內(nèi)每個像素點(diǎn)的RGBA的整型數(shù)據(jù)信息 height:200 //讀取的圖片像素信息區(qū)域高度 width:200 //讀取的圖片像素信息區(qū)域?qū)挾? }
2:了解像素區(qū)域數(shù)據(jù)的排布說明,以上獲取的圖片數(shù)據(jù)像素信息(imageData對象中的data屬性)為RGBA整型的一維數(shù)組數(shù)據(jù)。一個像素是有4個值(R,G,B,A)組成的。也就是說,數(shù)組信息每四個為一個像素點(diǎn)。因此,有以下規(guī)則,
第一個像素信息為:RGBA(data[0],data[1],data[2],data[3])
第二個像素信息為:RGBA(data[4],data[5],data[6],data[7])
.....
第N個像素信息為: RGBA(data[(n-1)*4],data[(n-1)*4+1],data[(n-1)*4+2],data[(n-1)*4+3])
.....
另外,像素區(qū)域既然是一個區(qū)域,它是有寬和高的。上面的推算公式適合單獨(dú)一行使用定位一個像素點(diǎn)。所以計算像素點(diǎn)時要考慮到在整個圖像區(qū)域內(nèi)定位:
以上圖為例。圖像的寬和高都為200,如果按照每一個像素為一行一列時。則該圖像共有200行,200列。所以要取得 i 行第 j 列的像素初始位置信息為:
var pos =[( i-1 )*200]+( j-1 )]*4;
其中,公式中的 i 表示行數(shù),j 表示列數(shù)。200為圖像的寬度。
demo代碼:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <canvas id="myCanvas" width="600" height="400" style="background:#000">瀏覽器不支持canvas</canvas> </body> <script type="text/javascript"> var canvas=document.getElementById("myCanvas"); var ctx=canvas.getContext("2d"); var image = new Image(); image.src='/WebWorkspace/EchartDemo/images/star.png'; var pixels=[]; //存儲像素數(shù)據(jù) var imageData; image.onload=function(){ ctx.drawImage(image,200,100,200,200); imageData=ctx.getImageData(200,100,200,200); //獲取圖表像素信息 getPixels(); //獲取所有像素 drawPic(); //繪制圖像 }; function getPixels(){ var pos=0; var data=imageData.data; //RGBA的一維數(shù)組數(shù)據(jù) //源圖像的高度和寬度為200px for(var i=1;i<=200;i++){ for(var j=1;j<=200;j++){ pos=[(i-1)*200+(j-1)]*4; //取得像素位置 if(data[pos]>=0){ var pixel={ x:200+j+Math.random()*20, //重新設(shè)置每個像素的位置信息 y:100+i+Math.random()*20, //重新設(shè)置每個像素的位置信息 fillStyle:'rgba('+data[pos]+','+(data[pos+1])+','+(data[pos+2])+','+(data[pos+3])+')' } pixels.push(pixel); } } } } function drawPic(){ var canvas=document.getElementById("myCanvas"); var ctx=canvas.getContext("2d"); ctx.clearRect(0,0,600,400); var len=pixels.length,curr_pixel=null; for(var i=0;i<len;i++){ curr_pixel=pixels[i]; ctx.fillStyle=curr_pixel.fillStyle; ctx.fillRect(curr_pixel.x,curr_pixel.y,1,1); } } </script> </html>
上面如果不理解, 對照代碼運(yùn)行一下試試?yán)斫獍桑?/p>
可惜本人數(shù)學(xué)不好,算法不會。不能為粒子加上炫酷的動態(tài)效果~~其實(shí)可以找一些算法讓粒子動起來的,有興趣可以做做看~
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
- 使用3D引擎threeJS實(shí)現(xiàn)星空粒子移動效果
- THREE.JS入門教程(4)創(chuàng)建粒子系統(tǒng)
- 原生JS+HTML5實(shí)現(xiàn)跟隨鼠標(biāo)一起流動的粒子動畫效果
- 基于Particles.js制作超炫粒子動態(tài)背景效果(仿知乎)
- 用JavaScript玩轉(zhuǎn)游戲物理(一)運(yùn)動學(xué)模擬與粒子系統(tǒng)
- javascript轉(zhuǎn)換靜態(tài)圖片,增加粒子動畫效果
- JS庫particles.js創(chuàng)建超炫背景粒子插件(附源碼下載)
- 基于three.js實(shí)現(xiàn)的3D粒子動效實(shí)例代碼
- JavaScript實(shí)現(xiàn)鼠標(biāo)移動粒子跟隨效果
- js canvas實(shí)現(xiàn)隨機(jī)粒子特效
相關(guān)文章
Javascript調(diào)試腳本的經(jīng)驗(yàn)之談
隨著用JavaScript編程的深入,你會開始理解那些JavaScript給出的不透明錯誤信息。一旦你理解了你常犯的一般性錯誤,你就會很快知道怎樣避免它們,這樣你寫的代碼中的錯誤將越來越少。2008-10-10webix+springmvc session超時跳轉(zhuǎn)登錄頁面
這篇文章主要介紹了webix+springmvc session超時跳轉(zhuǎn)登錄頁面的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-10-10判斷javascript的數(shù)據(jù)類型(示例代碼)
這篇文章主要是對判斷javascript的數(shù)據(jù)類型(示例代碼)進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12詳解bootstrap導(dǎo)航欄.nav與.navbar區(qū)別
本篇文章主要介紹了詳解bootstrap導(dǎo)航欄.nav與.navbar區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11