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 相关文章推荐
javascript面向对象编程(一) 实例代码
Jun 25 Javascript
JavaScript定义类或函数的几种方式小结
Jan 09 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
Nov 28 Javascript
javascript实现2048游戏示例
May 04 Javascript
js控制文本框只输入数字和小数点的方法
Mar 10 Javascript
JavaScript三元运算符的多种使用技巧
Apr 16 Javascript
javascript运算符语法全面概述
Jul 14 Javascript
JS动态计算移动端rem的解决方案
Oct 14 Javascript
select获取下拉框的值 下拉框默认选中方法
Feb 28 Javascript
10分钟彻底搞懂Http的强制缓存和协商缓存(小结)
Aug 30 Javascript
在angularJs中进行数据遍历的2种方法
Oct 08 Javascript
jQuery实现可以计算进制转换的计算器
Oct 19 jQuery
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
destoon整合UCenter图文教程
2014/06/21 PHP
php中spl_autoload详解
2014/10/17 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
php ajax confirm 删除实例详解
2019/03/06 PHP
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
JQuery 操作select标签实现代码
2010/05/14 Javascript
基于BootStarp的Dailog
2016/04/28 Javascript
详解Backbone.js框架中的模型Model与其集合collection
2016/05/05 Javascript
js拼接html字符串的注意事项
2016/10/13 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
JavaScript操作文件_动力节点Java学院整理
2017/06/30 Javascript
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
详解JavaScript添加给定的标签选项
2018/09/17 Javascript
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
原生js实现3D轮播图
2020/03/21 Javascript
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
Python中的CURL PycURL使用例子
2014/06/01 Python
初步探究Python程序的执行原理
2015/04/11 Python
理解Python中函数的参数
2015/04/27 Python
Python中typing模块与类型注解的使用方法
2019/08/05 Python
python实现超市商品销售管理系统
2019/10/25 Python
python使用pip安装SciPy、SymPy、matplotlib教程
2019/11/20 Python
pycharm设置默认的UTF-8编码模式的方法详解
2020/06/01 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
2020/06/24 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
YSL圣罗兰美妆英国官网:Yves Saint Laurent Beauty UK
2019/08/03 全球购物
经销商订货会主持词
2014/03/27 职场文书
小学三好学生事迹材料
2014/08/15 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
家属慰问信
2015/02/14 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
Django展示可视化图表的多种方式
2021/04/08 Python
基于Redis延迟队列的实现代码
2021/05/13 Redis
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS