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 表单取值赋值的一些基本操作
Oct 11 Javascript
JSQL 批量图片切换的实现代码
May 05 Javascript
javascript使用onclick事件改变选中行的颜色
Dec 30 Javascript
js的正则test,match,exec详细解析
Jan 29 Javascript
使用jquery动态加载Js文件和Css文件
Oct 24 Javascript
ES6新特性五:Set与Map的数据结构实例分析
Apr 21 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
Mar 12 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
Oct 31 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
Apr 09 Javascript
jquery实现上传图片功能
Jun 29 jQuery
简单了解Vue computed属性及watch区别
Jul 10 Javascript
JavaScript判断数据类型有几种方法及区别介绍
Sep 02 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
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
2014/10/24 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
分享php分页的功能模块
2015/06/16 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
2018/10/10 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
javascript tips提示框组件实现代码
2010/11/19 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
ext前台接收action传过来的json数据示例
2014/06/17 Javascript
jQuery on()方法使用技巧详解
2015/04/16 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
浅析vue.js数组的变异方法
2018/06/30 Javascript
Node.js 获取微信JS-SDK CONFIG的方法示例
2019/05/21 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
Vue单文件组件开发实现过程详解
2020/07/30 Javascript
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
Python进阶篇之字典操作总结
2016/11/16 Python
在CMD命令行中运行python脚本的方法
2018/05/12 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
Python pycharm 同时加载多个项目的方法
2019/01/17 Python
Python3 元组tuple入门基础
2020/02/09 Python
应聘医学检验人员自荐信
2013/09/27 职场文书
儿科护士实习自我鉴定
2013/10/17 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
2014年采购部工作总结
2014/11/20 职场文书
python 利用 PIL 将数组值转成图片的实现
2021/04/12 Python