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

Canvas + JavaScript 制作圖片粒子效果

 更新時(shí)間:2017年02月08日 11:07:55   作者:Jeremy陽(yáng)仔  
本文將詳細(xì)介紹Canvas + JavaScript 制作圖片粒子效果的方法。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧

首先看一下源圖和轉(zhuǎn)換成粒子效果的對(duì)比圖:

左側(cè)圖片為源圖,右側(cè)圖片為粒子效果圖。該效果是在Canvas畫布上制作的。將圖片制作成粒子效果相對(duì)而言是比較簡(jiǎn)單的。重點(diǎn)了解兩個(gè)知識(shí)點(diǎn)即可

1:圖片是通過(guò)image對(duì)象形式繪制在畫布上的,然后使用Canvas的getImageData接口,獲取圖像的像素信息。

var imageData=ctx.getImageData(x, y, width, height);

參數(shù)說(shuō)明:x,y為畫布上的x和y坐標(biāo)

               width,height為獲取指定區(qū)域圖像的信息

返回值說(shuō)明:imageData為返回值,它是一個(gè)對(duì)象,包含三個(gè)屬性

imageData={
 data:Unit8ClampedArray[10000] //一個(gè)包含圖片區(qū)域內(nèi)每個(gè)像素點(diǎn)的RGBA的整型數(shù)據(jù)信息
 height:200 //讀取的圖片像素信息區(qū)域高度
 width:200   //讀取的圖片像素信息區(qū)域?qū)挾?
}

2:了解像素區(qū)域數(shù)據(jù)的排布說(shuō)明,以上獲取的圖片數(shù)據(jù)像素信息(imageData對(duì)象中的data屬性)為RGBA整型的一維數(shù)組數(shù)據(jù)。一個(gè)像素是有4個(gè)值(R,G,B,A)組成的。也就是說(shuō),數(shù)組信息每四個(gè)為一個(gè)像素點(diǎn)。因此,有以下規(guī)則,

第一個(gè)像素信息為:RGBA(data[0],data[1],data[2],data[3])

第二個(gè)像素信息為:RGBA(data[4],data[5],data[6],data[7])

  .....

第N個(gè)像素信息為: RGBA(data[(n-1)*4],data[(n-1)*4+1],data[(n-1)*4+2],data[(n-1)*4+3])

  .....

另外,像素區(qū)域既然是一個(gè)區(qū)域,它是有寬和高的。上面的推算公式適合單獨(dú)一行使用定位一個(gè)像素點(diǎn)。所以計(jì)算像素點(diǎn)時(shí)要考慮到在整個(gè)圖像區(qū)域內(nèi)定位:

以上圖為例。圖像的寬和高都為200,如果按照每一個(gè)像素為一行一列時(shí)。則該圖像共有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=[]; //存儲(chǔ)像素?cái)?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è)置每個(gè)像素的位置信息
   y:100+i+Math.random()*20, //重新設(shè)置每個(gè)像素的位置信息
   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>

上面如果不理解, 對(duì)照代碼運(yùn)行一下試試?yán)斫獍桑?/p>

可惜本人數(shù)學(xué)不好,算法不會(huì)。不能為粒子加上炫酷的動(dòng)態(tài)效果~~其實(shí)可以找一些算法讓粒子動(dòng)起來(lái)的,有興趣可以做做看~

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • Package.js  現(xiàn)代化的JavaScript項(xiàng)目make工具

    Package.js 現(xiàn)代化的JavaScript項(xiàng)目make工具

    Package.js是一個(gè)很方便的JavaScript包依賴管理及Make工具。它的設(shè)計(jì)目標(biāo)是使瀏覽器端的JavaScript Component/App 開發(fā)更加模塊化
    2012-05-05
  • JavaScript代碼應(yīng)該放在HTML代碼哪個(gè)位置比較好?

    JavaScript代碼應(yīng)該放在HTML代碼哪個(gè)位置比較好?

    這篇文章主要介紹了JavaScript代碼應(yīng)該放在HTML代碼哪個(gè)位置比較好?本文總結(jié)了多種放置JS代碼的方法,需要的朋友可以參考下
    2014-10-10
  • javascript和HTML5利用canvas構(gòu)建猜牌游戲?qū)崿F(xiàn)算法

    javascript和HTML5利用canvas構(gòu)建猜牌游戲?qū)崿F(xiàn)算法

    讓我猜猜你心中的牌,先隨機(jī)生成27張牌,不能重復(fù)列出三列牌,然后記住其中一張,然后點(diǎn)擊牌所在的列,多次就可以猜出你想的牌,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈
    2013-07-07
  • bootstrap 設(shè)置checkbox部分選中效果

    bootstrap 設(shè)置checkbox部分選中效果

    本篇文章主要介紹了bootstrap 設(shè)置checkbox部分選中效果,主要涉及到j(luò)s各個(gè)方面的內(nèi)容,對(duì)于bootstrap設(shè)置checkbox選中效果感興趣的朋友可以參考一下吧
    2017-04-04
  • JavaScript實(shí)現(xiàn)給按鈕加上雙重動(dòng)作的方法

    JavaScript實(shí)現(xiàn)給按鈕加上雙重動(dòng)作的方法

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)給按鈕加上雙重動(dòng)作的方法,可實(shí)現(xiàn)文本框元素值添加及頁(yè)面跳轉(zhuǎn)的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • 如何處理JSON中的特殊字符

    如何處理JSON中的特殊字符

    這篇文章主要介紹了如何處理JSON中的特殊字符,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • 微信小程序Vant組件庫(kù)的安裝與使用教程

    微信小程序Vant組件庫(kù)的安裝與使用教程

    之前推薦過(guò)的移動(dòng)端web組件庫(kù) Vant是Vue.js版本的,其對(duì)內(nèi)承載了有贊所有核心業(yè)務(wù),對(duì)外有十多萬(wàn)開發(fā)者在使用,一直是業(yè)界主流的移動(dòng)端組件庫(kù)之一,下面這篇文章主要給大家介紹了關(guān)于微信小程序Vant組件庫(kù)的安裝與使用的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • [js高手之路]從原型鏈開始圖解繼承到組合繼承的產(chǎn)生詳解

    [js高手之路]從原型鏈開始圖解繼承到組合繼承的產(chǎn)生詳解

    下面小編就為大家?guī)?lái)一篇[js高手之路]從原型鏈開始圖解繼承到組合繼承的產(chǎn)生詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • JavaScript數(shù)字精度丟失問(wèn)題的解決方案

    JavaScript數(shù)字精度丟失問(wèn)題的解決方案

    JavaScript使用64位浮點(diǎn)數(shù)表示數(shù)字(基于IEEE 754標(biāo)準(zhǔn)),這導(dǎo)致某些十進(jìn)制數(shù)字在計(jì)算過(guò)程中出現(xiàn)精度丟失,所以本文給大家介紹了JavaScript數(shù)字精度丟失問(wèn)題的解決方案,需要的朋友可以參考下
    2024-10-10
  • ES6 Set結(jié)構(gòu)的應(yīng)用實(shí)例分析

    ES6 Set結(jié)構(gòu)的應(yīng)用實(shí)例分析

    這篇文章主要介紹了ES6 Set結(jié)構(gòu)的應(yīng)用,結(jié)合實(shí)例形式分析了ES6 set結(jié)構(gòu)的功能、特點(diǎn)、常見用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-06-06

最新評(píng)論

安仁县| 青浦区| 措勤县| 天津市| 永济市| 尚志市| 吐鲁番市| 太仆寺旗| 永寿县| 罗甸县| 保靖县| 永州市| 颍上县| 乐业县| 习水县| 平邑县| 太和县| 阿荣旗| 克山县| 信阳市| 那曲县| 黔南| 东光县| 明水县| 乌拉特后旗| 衡阳县| 澄江县| 嘉义市| 绥芬河市| 綦江县| 平利县| 阳城县| 曲麻莱县| 睢宁县| 乌拉特后旗| 衡阳县| 珠海市| 新泰市| 雷州市| 桃园县| 枣阳市|