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 相关文章推荐
JQuery CSS样式控制 学习笔记
Jul 23 Javascript
jQuery学习5 jQuery事件模型
Feb 07 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
Jan 09 Javascript
javascript常用经典算法实例详解
Nov 25 Javascript
JS求解三元一次方程组值的方法
Jan 03 Javascript
移动端基础事件总结与应用
Jan 12 Javascript
简单实现js菜单栏切换效果
Mar 04 Javascript
浅谈ES6新增的数组方法和对象
Aug 08 Javascript
vue+iview 实现可编辑表格的示例代码
Oct 31 Javascript
JS实现处理时间,年月日,星期的公共方法示例
May 31 Javascript
keep-alive不能缓存多层级路由菜单问题解决
Mar 10 Javascript
基于JavaScript实现表格隔行换色
May 08 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编程语言开发动态WAP页面
2006/10/09 PHP
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
2009/10/15 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
2013/06/24 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
php将数组转换成csv格式文件输出的方法
2015/03/14 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
解析JavaScript的ES6版本中的解构赋值
2015/07/28 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
jQuery EasyUI 页面加载等待及页面等待层
2017/02/06 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
浅谈Angular 观察者模式理解
2018/11/01 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
elementUI select组件value值注意事项详解
2019/05/29 Javascript
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
python3操作微信itchat实现发送图片
2018/02/24 Python
python中int与str互转方法
2018/07/02 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
pytorch打印网络结构的实例
2019/08/19 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
KIKO美国官网:意大利的平价彩妆品牌
2017/05/16 全球购物
手机促销活动方案
2014/02/05 职场文书
营业用房租赁协议书
2014/11/26 职场文书
物业项目经理岗位职责
2015/04/01 职场文书
2015年乡镇统计工作总结
2015/04/22 职场文书
2015年财务部年度工作总结
2015/05/19 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
python编写函数注意事项总结
2021/03/29 Python
React 高阶组件HOC用法归纳
2021/06/13 Javascript
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL