Canvas 放烟花合集 -- 用粉丝头像做成烟花绽放🧨
“我对着烟花许愿,希望你永远在我身边”
“凑不够满天星辰那就去看看烟花吧,人间烟火气,最抚凡人心”
小tips:喜欢的可以关注博主私信代码噢~
也可以看看前面两篇烟花噢
欢迎访问博主的个人网站:一口奶盖
本文实现效果
今天要实现的效果是将图片做成烟花绽放,非常感谢大家的支持~
实现效果
这个小demo实现的方法和文字烟花实现的方法大致是相同的~
1. 将图片绘制在画布上
首先我们需要将需要制作成烟花的图片绘制在画布上
特别注意:
- 由于这种图片是用来取色用的底图所以我们并不希望这张图片被用户看到,因此我们可以将这张图片渲染在新的画布上,烟花渲染在不同的画布上,这样上面画布就可以盖住下面的画布,这张底图也不会被看见
- 由于图片的加载需要一定的时间,所以我们对图片操作的代码需要写在回调函数里面,不然图片可能会未加载而报错
let img1 = new Image();
//随机取一张图片
img1.src = Math.floor(Math.random()*9 +1) + '.jpg'
// 等待图片加载完毕后绘制图片
img1.onload = function () {
let imgWidth = 400
let imgHeight = 400
inCtx.drawImage(img1, 0, 0, imgWidth, imgHeight)
}
2. 获取像素点信息
这一步的目的是获取到图片每个像素的颜色,这样我们就可以通过这些像素点合成一张图片,也可以排除掉一些像素点,筛出想要的图形
let imgData = inCtx.getImageData(0, 0, imgWidth, imgHeight)
在前面的代码中我们在 (0,0) 的位置绘制了图片,我们通过getImageData将这块区域的像素信息取出来,返回结果是包含像素点信息的对象,类似于下图,详细可看上篇文章
3. 给烟花粒子添加属性
我们需要实现的烟花效果由许许多多的烟花粒子组成,每个粒子都有它自己的颜色和它的运动轨迹,实现图片烟花的关键就在于它的颜色需要正确,我们可以通过遍历像素点信息imageData对象,将该像素点的颜色作为烟花粒子颜色存储起来,也就是将图片一点点复制的过程
for (let h = 0; h < imgHeight; h += 8) {
for (let w = 0; w < imgWidth; w += 8) {
let position = (imgWidth * h + w) * 4;
// 返回的数组是rgba的方式存储
let r = imgData.data[position],
g = imgData.data[position + 1],
b = imgData.data[position + 2],
a = imgData.data[position + 3];
if (r + g + b == 0) {
continue
}
let firework = {};
firework.x = x;
firework.y = y;
firework.fx = x + w - imgWidth / 2;
firework.fy = y + h - imgHeight / 2;
firework.size = 1; // Math.floor(Math.random() * 2) + 1
firework.speed = 5;
firework.alpha = 1;
firework.r = r
firework.g = g
firework.b = b
firework.color = "rgba(" + r + "," + g + "," + b + "," + a + ")"
fireworks.push(firework)
}
}
在遍历的过程中因为我们需要实现粒子的效果,因此需要隔几个像素点在取一个,这样绘制出来图像就是粒子状的,我们将烟花粒子渲染即可
4. 渲染烟花粒子
渲染的方法就是在粒子该在的位置上画个小圆就可!颜色,位置,半径等信息利用先前给粒子添加的属性,特别需要颜色的书写格式噢~
ctx.beginPath();
ctx.arc(firework.x, firework.y, firework.size, Math.PI * 2, false);
// 结束
ctx.closePath();
ctx.fillStyle = "rgba(" + firework.r + "," + firework.g + "," + firework.b + "," + firework.alpha + ")"
ctx.fill();
5. 实现烟花粒子动画
我们需要在每次渲染时将烟花粒子当前的位置向下偏移,透明度降低实现烟花降落殆尽的效果,当透明度将低于0时移出粒子
firework.x += (firework.fx - firework.x) / 10;
firework.y += (firework.fy - firework.y) / 10 -(firework.alpha - 1.8)*firework.speed;
firework.alpha -= 0.02;
// 如果透明度小于0就删除这个粒子
if (firework.alpha <= 0) {
fireworks.splice(i, 1);
// 跳过这次循环,不进行绘制
continue;
}
6. 实现拖尾效果
为了让烟花更加的真实,我们需要给烟花粒子添加拖尾的效果,在每一次重新渲染之前给新建一个蒙层从而实现拖尾的效果
ctx.globalCompositeOperation = 'destination-out';
ctx.fillStyle = 'rgba(0,0,0,' + 10 / 100 + ')';
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.globalCompositeOperation = 'lighter';
烟花合集
这两篇文章都是实现不同的烟花效果噢,大家可以一起学习一下噢!需要源码可以关注私信博主噢~
烟花的几篇文章就到这里了,期待博主的下个专题吧~
一起学习,共同进步!
Canvas 放烟花合集 -- 用粉丝头像做成烟花绽放🧨的更多相关文章
- 精彩看点 | GIAC大会PPT+视频合集全量放送!
GIAC是中国互联网技术领域的行业盛事,每年从互联网架构最热门的系统架构设计.人工智能.机器学习.工程效率.区块链.分布式架构等领域甄选前沿有典型代表的技术创新及研发实践的架构案例,分享他们在本年度最 ...
- 前端,Java,产品经理,微信小程序,Python等资源合集大放送
为了感恩大家长久以来的关注和支持,小编准备了一些福利,整理了包含前端,Java,产品经理,微信小程序,Python,网站源码,Android应用视频教程,微信公众平台开发教程及材料等资源合集大放送. ...
- 深度学习优质学习项目大放送!-AI Studio精选开源项目合集推荐
近期 在AI Studio上发现了不少优质的开源深度学习项目,从深度学习入门到进阶,涵盖了CV.NLP.生成对抗网络.强化学习多个研究方向,还有最新的动态图,都以NoteBook的方式直接开源出来,并 ...
- 掘金 Android 文章精选合集
掘金 Android 文章精选合集 掘金官方 关注 2017.07.10 16:42* 字数 175276 阅读 50053评论 13喜欢 669 用两张图告诉你,为什么你的 App 会卡顿? - A ...
- 最新最全的 Android 开源项目合集
原文链接:https://github.com/opendigg/awesome-github-android-ui 在 Github 上做了一个很新的 Android 开发相关开源项目汇总,涉及到 ...
- swift 动画合集
本例参照objective-c的动画合集进行swift的转换,objective-c地址参照地址https://github.com/yixiangboy/IOSAnimationDemo 1.基础动 ...
- 大量Javascript/JQuery学习教程电子书合集
[推荐分享]大量Javascript/JQuery学习教程电子书合集,送给有需要的人 不收藏是你的错^_^. 经证实,均可免费下载. 资源名称 资源大小 15天学会jQuery(完整版).pd ...
- Web测试到底是在测什么(资料合集)
开始今晚的主题之前 先来看一张图, 这是老徐16年10月份,线上Web主题分享时整理的大纲 图片略模糊 看得清就好 Web测试, 进行抽离拆分,基本上就如上一些内容. 不管是测什么系统,什么功能,基本 ...
- 11、js 数组详细操作方法及解析合集
js 数组详细操作方法及解析合集 前言 在开发中,数组的使用场景非常多,平日中也涉及到很多数组的api/相关操作,一直也没有对这块内容进行一块整理总结,很多时候就算用过几次这个api,在开发中也很容易 ...
随机推荐
- jQuery <= 1.11.3 DomXSS漏洞
听团里说WordPress又爆跨站漏洞了:" XSS漏洞在Jetpack和二十五默认主题影响百万WordPress用户 ",分析发现原来是jQuery老版本的DOM XSS漏洞[错 ...
- php-抽象工厂
目标:创建有依赖关系的实例;(套餐) <?php //抽象类 食物 interface IAllayFood { function Allay(); } interface IDrinkFood ...
- Jemter请求乱码解决方案
1:jemeter查看结果树乱码 (1)在jmeter的bin目录下找到jmeter.properties这个文件,添加上 sampleresult.default.encoding=utf-8 (2 ...
- 自己写登陆验证及借用auth的is_authenticated验证是否登陆
一. 自己写登陆需要注册,一个session的处理,还有一个session的删除 #自定义一个闭包装饰器,来验证def checkLogin(func): def wrapper(request, * ...
- LR集合点策略
给大家分享一个LR集合点策略,跑并发脚本时,一定要设置策略,要不然得出的响应时间无意义.默认选择第一个(当所有虚拟用户中的x % 到达集合点进释放,即仅当指定百分比的虚拟用户到达集合点时,才释放虚拟用 ...
- 『GoLang』字典Map
map是一种元素对的无序集合,一组称为元素value,另一组为唯一键索引key. 未初始化map的值为nil.map 是引用类型,可以使用如下声明: var map1 map[keytype]valu ...
- win10蓝牙鼠标无法连接,需pin码
从控制面板进到"设备和打印机",点击"添加设备" 鼠标切换到匹配模式,就可以看到自己的鼠标了,点"下一步" 出现了一样的画面,是的,不用输P ...
- Loj#116-[模板]有源汇有上下界最大流
正题 题目链接:https://loj.ac/p/116 题目大意 \(n\)个点\(m\)条边的一张图,每条边有流量上下限制,求源点到汇点的最大流. 解题思路 先别急着求上面那个,考虑一下怎么求无源 ...
- 今天我抓了个 HTTPS 的包
之前写过一篇讲 HTTPS 的思想的文章. 破玩意 | 用 HTTPS 传纸条 后来又写了篇用更凝练的语言总体描述了 HTTPS 的主干. 叮咚 | HTTPS 的分支和主干 想必通过这两篇文章,HT ...
- [RabbitMQ]下载&安装
RabbitMQ是基于Erlang语言开发的消息中间件,所以使用RabbitMQ需要安装Erlang和RabbitMQ两个软件. 1 Erlang 1.1 下载 官网下载地址:https://www. ...