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实现由下向上展开效果的例子
Dec 08 Javascript
jquery实现的缩略图预览滑块实例
Jun 25 Javascript
纯javascript实现分页(两种方法)
Aug 26 Javascript
JS控制文本域只读或可写属性的方法
Jun 24 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
Nov 03 Javascript
jQuery获取table表中的td标签(实例讲解)
Jul 28 jQuery
JSON对象转化为字符串详解
Aug 11 Javascript
vue2中引用及使用 better-scroll的方法详解
Nov 15 Javascript
js canvas实现写字动画效果
Nov 30 Javascript
javascript实现移动端触屏拖拽功能
Jul 29 Javascript
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
Vue ​v-model相关知识总结
Jan 28 Vue.js
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 获取远程网页内容的函数
2009/09/08 PHP
php的urlencode()URL编码函数浅析
2011/08/09 PHP
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
2013/06/01 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
getimagesize获取图片尺寸实例
2014/11/15 PHP
PHP的pcntl多进程用法实例
2015/03/19 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
一个js的tab切换效果代码[代码分离]
2010/04/11 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
jquery常用函数与方法汇总
2015/09/01 Javascript
angular 基于ng-messages的表单验证实例
2017/05/04 Javascript
微信小程序组件 marquee实例详解
2017/06/23 Javascript
AngularJS创建一个上传照片的指令实例代码
2018/02/24 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
一看就会的vuex实现登录验证(附案例)
2020/01/09 Javascript
js代码实现轮播图
2020/05/04 Javascript
python使用urllib2模块获取gravatar头像实例
2013/12/18 Python
基于python实现计算两组数据P值
2020/07/10 Python
HTML5制作表格样式
2016/11/15 HTML / CSS
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
上海天奕面试题笔试题
2015/04/19 面试题
扶贫办主任查摆“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
安全生产月宣传标语
2014/10/06 职场文书
2014年度个人工作总结
2014/11/07 职场文书
2015年幼儿园个人工作总结
2015/04/25 职场文书
求职自荐信该如何书写?
2019/06/24 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python
Golang 并发下的问题定位及解决方案
2022/03/16 Golang
Java并发编程之原子性-Atomic的使用
2022/03/16 Java/Android