Canvas + JavaScript 制作图片粒子效果


Posted in Javascript onFebruary 08, 2017

首先看一下源图和转换成粒子效果的对比图:

Canvas + JavaScript 制作图片粒子效果Canvas + JavaScript 制作图片粒子效果

左侧图片为源图,右侧图片为粒子效果图。该效果是在Canvas画布上制作的。将图片制作成粒子效果相对而言是比较简单的。重点了解两个知识点即可

1:图片是通过image对象形式绘制在画布上的,然后使用Canvas的getImageData接口,获取图像的像素信息。

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

参数说明:x,y为画布上的x和y坐标

               width,height为获取指定区域图像的信息

返回值说明:imageData为返回值,它是一个对象,包含三个属性

imageData={
 data:Unit8ClampedArray[10000] //一个包含图片区域内每个像素点的RGBA的整型数据信息
 height:200 //读取的图片像素信息区域高度
 width:200 //读取的图片像素信息区域宽度
}

2:了解像素区域数据的排布说明,以上获取的图片数据像素信息(imageData对象中的data属性)为RGBA整型的一维数组数据。一个像素是有4个值(R,G,B,A)组成的。也就是说,数组信息每四个为一个像素点。因此,有以下规则,

第一个像素信息为: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])

  .....

另外,像素区域既然是一个区域,它是有宽和高的。上面的推算公式适合单独一行使用定位一个像素点。所以计算像素点时要考虑到在整个图像区域内定位:

以上图为例。图像的宽和高都为200,如果按照每一个像素为一行一列时。则该图像共有200行,200列。所以要取得 i 行第 j 列的像素初始位置信息为:

var pos =[( i-1 )*200]+( j-1 )]*4;

其中,公式中的 i 表示行数,j 表示列数。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=[]; //存储像素数据
 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的一维数组数据
 //源图像的高度和宽度为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, //重新设置每个像素的位置信息
   y:100+i+Math.random()*20, //重新设置每个像素的位置信息
   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>

上面如果不理解, 对照代码运行一下试试理解吧:

可惜本人数学不好,算法不会。不能为粒子加上炫酷的动态效果~~其实可以找一些算法让粒子动起来的,有兴趣可以做做看~

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
Prototype RegExp对象 学习
Jul 19 Javascript
关于this和self的使用说明
Aug 01 Javascript
基于jQuery的实现简单的分页控件
Oct 10 Javascript
javaScript实现浮点数转十六进制字符
Oct 29 Javascript
浅述Javascript的外部对象
Dec 07 Javascript
Vue组件开发初探
Feb 14 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
Aug 04 jQuery
移动设备手势事件库Touch.js使用详解
Aug 18 Javascript
AngularJS与BootStrap模仿百度分页的示例代码
May 23 Javascript
详解vue-cli3 中跨域解决方案
Apr 10 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
Jul 14 jQuery
Openlayers实现地图的基本操作
Sep 28 Javascript
jQuery实现标签页效果实战(4)
Feb 08 #Javascript
Angular.JS实现无限级的联动菜单(使用demo)
Feb 08 #Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
Feb 08 #Javascript
jQuery实现级联下拉框实战(5)
Feb 08 #Javascript
webpack入门+react环境配置
Feb 08 #Javascript
JavaScript实现鼠标点击导航栏变色特效
Feb 08 #Javascript
jQuery实现优雅的弹窗效果(6)
Feb 08 #Javascript
You might like
PHP分页详细讲解(有实例)
2013/10/30 PHP
php使用curl发送json格式数据实例
2013/12/17 PHP
ThinkPHP缓存方法S()概述
2014/06/13 PHP
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
PHP使用pdo实现事务处理操作示例
2018/09/05 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
javascript instanceof 内部机制探析
2010/10/15 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
getElementByIdx_x js自定义getElementById函数
2012/01/24 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
Javascript中replace()小结
2015/09/30 Javascript
jQuery实现仿QQ头像闪烁效果的文字闪动提示代码
2015/11/03 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
JS使用正则表达式找出最长连续子串长度
2017/10/26 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
Vue页面切换和a链接的本质区别详解
2019/11/12 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
vue组件开发之slider组件使用详解
2020/08/21 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
通过python下载FTP上的文件夹的实现代码
2013/02/10 Python
Python实现批量修改文件名实例
2015/07/08 Python
django 模型中的计算字段实例
2020/05/19 Python
Python3如何使用多线程升程序运行速度
2020/08/11 Python
材料加工工程求职信
2014/02/19 职场文书
大学生村官考核材料
2014/05/23 职场文书
最美孝心少年事迹材料
2014/08/15 职场文书
四风查摆剖析材料
2014/10/10 职场文书
银行授权委托书样本
2014/10/13 职场文书
2016重阳节红领巾广播稿
2015/12/18 职场文书
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android