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自定义事件介绍
Aug 29 Javascript
jQuery瀑布流插件Wookmark使用实例
Apr 02 Javascript
JavaScript原生对象之Number对象的属性和方法详解
Mar 13 Javascript
JavaScript获取页面中超链接数量的方法
Nov 09 Javascript
JS使用单链表统计英语单词出现次数
Jun 16 Javascript
Bootstrap表单布局
Jul 19 Javascript
VueJs与ReactJS和AngularJS的异同点
Dec 12 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
Dec 04 Javascript
在vue项目中,将juery设置为全局变量的方法
Sep 25 Javascript
Vue获取页面元素的相对位置的方法示例
Feb 05 Javascript
JavaScript canvas实现跟随鼠标事件
Feb 10 Javascript
基于jQuery拖拽事件的封装
Nov 29 jQuery
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自动更新新闻DIY
2006/10/09 PHP
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
PHP判断表单复选框选中状态完整例子
2014/06/24 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
php实现根据词频生成tag云的方法
2015/04/17 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
jquery.alert 弹出式复选框实现代码
2009/06/15 Javascript
jQuery EasyUI API 中文文档 - NumberBox数字框
2011/10/13 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
2014/11/28 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
使用Promise链式调用解决多个异步回调的问题
2017/01/15 Javascript
解决layui中的form表单与button的点击事件冲突问题
2018/08/15 Javascript
nodejs微信开发之自动回复的实现
2019/03/17 NodeJs
手把手教你 CKEDITOR 4 扩展插件制作
2019/06/18 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
Python自动重试HTTP连接装饰器
2015/04/28 Python
Python使用smtplib模块发送电子邮件的流程详解
2016/06/27 Python
使用Python多线程爬虫爬取电影天堂资源
2016/09/23 Python
python虚拟环境virtualenv的使用教程
2017/10/20 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
如何查看在weblogic中已经发布的EJB
2012/06/01 面试题
2015教师见习期工作总结
2014/12/12 职场文书
上级领导检查欢迎词
2015/09/30 职场文书
Nginx反爬虫策略,防止UA抓取网站
2021/03/31 Servers
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android
python数字图像处理之图像的批量处理
2022/06/28 Python