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判断是否按回车键并解决浏览器之间的差异
May 13 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
Sep 12 Javascript
浅谈JavaScript函数节流
Dec 09 Javascript
Jquery动态添加输入框的方法
May 29 Javascript
JS正则匹配中文的方法示例
Jan 06 Javascript
Javascript for in的缺陷总结
Feb 03 Javascript
js实现常见的工具条效果
Mar 02 Javascript
easyUI下拉列表点击事件使用方法
May 18 Javascript
bootstrap3-dialog-master模态框使用详解
Aug 22 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
Sep 06 Javascript
原生JS实现天气预报
Jun 16 Javascript
利用JavaScript写一个简单计算器
Nov 27 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分页显示制作详细讲解
2006/10/09 PHP
PHP创建多级目录的两种方法
2016/10/28 PHP
Yii 2中的load()和save()示例详解
2017/08/03 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
Javascript表单验证要注意的事项
2014/09/29 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
JS之if语句对接事件动作逻辑(详解)
2017/06/28 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
[02:00]DOTA2英雄COSPLAY闹市街头巡游助威2015国际邀请赛
2015/08/02 DOTA
在Python下尝试多线程编程
2015/04/28 Python
python中异常报错处理方法汇总
2016/11/20 Python
Python中字典和集合学习小结
2017/07/07 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
2020/05/15 Python
10 套华丽的CSS3 按钮小结
2012/10/03 HTML / CSS
几个解决兼容IE6\7\8不支持html5标签的几个方法
2013/01/07 HTML / CSS
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
苹果美国官方商城:Apple美国
2016/08/24 全球购物
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
C语言50道问题
2014/10/23 面试题
关于Assembly命名空间的三个面试题
2015/07/23 面试题
介绍一下.NET构架下remoting和webservice
2014/05/08 面试题
高三毕业寄语
2014/04/10 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
实验室标语
2014/06/21 职场文书
生物工程专业求职信
2014/09/03 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
vue-cropper组件实现图片切割上传
2021/05/27 Vue.js