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 相关文章推荐
JS判断是否为数字,是否为整数,是否为浮点数的代码
Apr 24 Javascript
jQuery的链式调用浅析
Dec 03 Javascript
javascript date格式化示例
Sep 25 Javascript
jQuery分组选择器用法实例
Dec 23 Javascript
javascript 数组操作详解
Jan 29 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
May 18 Javascript
AngularJs Dependency Injection(DI,依赖注入)
Sep 02 Javascript
vue之nextTick全面解析
May 17 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
Sep 26 jQuery
axios简单实现小程序延时loading指示
Jul 30 Javascript
json字符串传到前台input的方法
Aug 06 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
Jan 08 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
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
PHP运行时强制显示出错信息的代码
2011/04/20 PHP
javascript正则表达式中参数g(全局)的作用
2010/11/11 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
2014/05/26 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
JavaScript继承模式粗探
2016/01/12 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
2016/10/27 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
微信小程序获取当前位置和城市名
2019/11/13 Javascript
js实现点赞效果
2020/03/16 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
学习python处理python编码问题
2011/03/13 Python
详细介绍Ruby中的正则表达式
2015/04/10 Python
Python统计单词出现的次数
2018/04/04 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
python 实现读取csv数据,分类求和 再写进 csv
2020/05/18 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
pandas使用函数批量处理数据(map、apply、applymap)
2020/11/27 Python
CSS3 box-sizing属性详解
2016/11/15 HTML / CSS
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
求职简历中个人的自我评价
2013/12/25 职场文书
缅怀先烈演讲稿
2014/09/03 职场文书
党委领导班子整改方案
2014/09/30 职场文书
优秀学生干部主要事迹材料
2015/11/04 职场文书
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers
如何利用python实现列表嵌套字典取值
2022/06/10 Python