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 相关文章推荐
IE JS无提示关闭窗口不提示的方法
Apr 29 Javascript
jQuery实现form表单reset按钮重置清空表单功能
Dec 18 Javascript
js二维数组定义和初始化的三种方法总结
Mar 03 Javascript
仿百度联盟对联广告实现代码
Aug 30 Javascript
Node.js中的流(Stream)介绍
Mar 30 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
Jan 22 Javascript
window.onerror()的用法与实例分析
Jan 27 Javascript
表单中单选框添加选项和移除选项
Jul 04 Javascript
再谈Javascript中的异步以及如何异步
Aug 19 Javascript
BootStrap中
Dec 10 Javascript
图片文字识别(OCR)插件Ocrad.js教程
Nov 26 Javascript
vue+eslint+vscode配置教程
Aug 09 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
声音就能俘获人心,蕾姆,是哪个漂亮小姐姐配音呢?
2020/03/03 日漫
一个好用的分页函数
2006/11/16 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
JS动画效果代码3
2008/04/03 Javascript
JavaScript 学习笔记(四)
2009/12/31 Javascript
jQuery MD5加密实现代码
2010/03/15 Javascript
JS 图片缩放效果代码
2010/06/09 Javascript
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
fckeditor粘贴Word时弹出窗口取消的方法
2014/10/30 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
JavaScript中模拟实现jsonp
2015/06/19 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
2016/04/17 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
vue实现简单表格组件实例详解
2017/04/16 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
js 数组详细操作方法及解析合集
2018/06/01 Javascript
详解小程序输入框闪烁及重影BUG解决方案
2018/08/31 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
[53:15]Mineski vs iG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
Python的迭代器和生成器使用实例
2015/01/14 Python
python脚本设置系统时间的两种方法
2016/02/21 Python
Python编程快速上手——PDF文件操作案例分析
2020/02/28 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
python openpyxl模块的使用详解
2021/02/25 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
大学生旅游业创业计划书
2014/01/29 职场文书
初级会计求职信范文
2014/02/15 职场文书
单位工作证明格式模板
2014/10/04 职场文书
答谢酒会主持词
2015/07/02 职场文书
运动会班级前导词
2015/07/20 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书