日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > HTML > 正文

Canvas 文本轉粒子效果的實現代碼

2024-08-26 00:21:20
字體:
來源:轉載
供稿:網友

本文介紹了Canvas 文本轉粒子效果的實現代碼,分享給大家,希望對大家有所幫助,具體如下:

Canvas,文本轉粒子效果,代碼

通過粒子來繪制文本讓人感覺很有意思,配合粒子的運動更會讓這個效果更加酷炫。本文介紹在 canvas 中通過粒子來繪制文本的方法。

實現原理

總的來說要做出將文本變成粒子展示的效果其實很簡單,實現的原理就是使用兩張 canvas,一張是用戶看不到的 A canvas,用來繪制文本;另一張是用戶看到的 B canvas,用來根據 A 的文本數據來生成粒子。直觀表示如圖:

Canvas,文本轉粒子效果,代碼

創建離屏 canvas

HTML 只需要放置主 canvas 即可:

<!-- HTML 結構 --><html><head>  ...</head><body>  <canvas id="stage"></canvas></body></html>

然后創建一個離屏 canvas,并繪制文本:

const WIDTH = window.innerWidth;const HEIGHT = window.innerHeight;const offscreenCanvas = document.createElement('canvas');const offscreenCtx = offscreenCanvas.getContext('2d');offscreenCanvas.width = WIDTH;offscreenCanvas.height = HEIGHT;offscreenCtx.font = '100px PingFang SC';offscreenCtx.textAlign = 'center';offscreenCtx.baseline = 'middle';offscreenCtx.fillText('Hello', WIDTH / 2, HEIGHT / 2);

這時頁面上什么也沒有發生,但實際上可以想象在離屏 canvas 上,此時應該如圖所示:

Canvas,文本轉粒子效果,代碼

核心方法 getImageData

使用 canvas 的 getImageData 方法,可以獲取一個 ImageData 對象,這個對象用來描述 canvas 指定區域內的像素數據。也就是說,我們可以獲取 “Hello” 這個文本每個像素點的位置和顏色,也就可以在指定位置生成粒子,最后形成的效果就是粒子拼湊成文本了。

要獲取像素信息,需要使用 ImageData 對象的 data 屬性,它將所有像素點的 rgba 值鋪開成了一個數組,每個像素點有 rgba 四個值,這個數組的個數也就是 像素點數量 * 4

假設我選取了一個 3 * 4 區域,那么一共 12 個像素點,每個像素點有 rgba 四個值,所以 data 這個數組就會有 12 * 4 = 48 個元素。

Canvas,文本轉粒子效果,代碼

如果打印出 data,可以看到即從左往右,從上往下排列這些像素點的 rgba。

Canvas,文本轉粒子效果,代碼

當然我們要獲取的區域必須要包含文本,所以應該獲取整個離屏 canvas 的區域:

const imgData = offscreenCtx.getImageData(0, 0, WIDTH, HEIGHT).data;

生成粒子

拿到 ImageData 后,通過遍歷 data 數組,可以判斷在離屏 canvas 的畫布中,哪些點是有色彩的(處于文本中間),哪些點是沒有色彩的(不在文本上),把那些有色彩的像素位置記下來,然后在主 canvas 上生成粒子,就 ok 了。

首先創建一下粒子類:

class Particle {    constructor (options = {}) {        const { x = 0, y = 0, color = '#fff', radius = 5} = options;        this.radius = radius;        this.x = x;        this.y = y;        this.color = color;    }    draw (ctx) {        ctx.beginPath();        ctx.arc(this.x, this.y, this.radius, 0, 2 * Math.PI, false);        ctx.fillStyle = this.color;        ctx.fill();        ctx.closePath();    }}

遍歷 data,我們可以根據透明度,也就是 rgba 中的第四個元素是否不為 0 來判斷該像素是否在文本中。

const particles = [];const skip = 4;for (var y = 0; y < HEIGHT; y += skip) {    for (var x = 0; x < WIDTH; x += skip) {        var opacityIndex = (x + y * WIDTH) * 4 + 3;        if (imgData[opacityIndex] > 0) {            particles.push(new Particle({                x,                y,                radius: 1,                color: '#2EA9DF'            }));        }    }}

我們用 particles 數組來存放所有的粒子,這里的 skip 的作用是遍歷的步長,如果我們一個像素一個像素地掃,那么最后拼湊文本的粒子將會非常密集,增大這個值,最后產生的粒子就會更稀疏。

最后在創建主 canvas 并繪制即可:

const canvas = document.querySelector('#stage');canvas.width = WIDTH;canvas.height = HEIGHT;const ctx = canvas.getContext('2d');for (const particle of particles) {    particle.draw(ctx);}

效果如下:

Canvas,文本轉粒子效果,代碼

完整代碼見01-basic-text-to-particles

添加效果

了解實現原理之后,其實其他的就都是給粒子添加一些動效了。首先可以讓粒子有一些隨機的位移,避免看上去過于整齊。

const particles = [];const skip = 4;for (var y = 0; y < HEIGHT; y += skip) {    for (var x = 0; x < WIDTH; x += skip) {        var opacityIndex = (x + y * WIDTH) * 4 + 3;        if (imgData[opacityIndex] > 0) {            // 創建粒子時加入隨機位移            particles.push(new Particle({                x: x + Math.random() * 6 - 3,                y: y + Math.random() * 6 - 3,                radius: 1,                color: '#2EA9DF'            }));        }    }}

效果如下:

Canvas,文本轉粒子效果,代碼

如果想實現變大的效果,如:

Canvas,文本轉粒子效果,代碼

這種要怎么實現呢,首先需要隨機產生粒子的大小,這只需要在創建粒子時對 radius 進行 random 即可。另外如果要讓粒子半徑動態改變,那么需要區分開粒子的渲染半徑和初始半徑,并使用 requestAnimationFrame 進行動畫渲染:

class Particle {    constructor (options = {}) {        const { x = 0, y = 0, color = '#fff', radius = 5} = options;        this.radius = radius;        // ...        this.dynamicRadius = radius; // 添加 dynamicRadius 屬性    }    draw (ctx) {        // ...        ctx.arc(this.x, this.y, this.dynamicRadius, 0, 2 * Math.PI, false); // 替換為 dynamicRadius        // ...    }        update () {        // TODO    }}requestAnimationFrame(function loop() {    requestAnimationFrame(loop);    ctx.fillStyle = '#fff';    ctx.fillRect(0, 0, WIDTH, HEIGHT);    for (const particle of particles) {        particle.update();        particle.draw(ctx);    }});

那么關鍵就在于粒子的 update 方法要如何實現了,假設我們想讓粒子半徑在 1 到 5 中平滑循環改變,很容易讓人聯想到三角函數,如:

Canvas,文本轉粒子效果,代碼

橫軸應該是與時間相關,可以再維護一個變量每次調用 update 的時候進行加操作,簡單做也可以直接用時間戳來進行計算。update 方法示例如下:

update () {    this.dynamicRadius = 3 + 2 * Math.sin(new Date() / 1000 % 1000 * this.radius);}

完整代碼見 02-text-to-particles-with-size-changing

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
欧美一卡2卡3卡4卡| av免费在线不卡| 国产福利在线导航| 亚洲大胆人体av| 久久欧美中文字幕| 国产网站av| 中文精品在线观看| 欧美三级中文字幕| 国产一区二中文字幕在线看| 欧美亚洲国产日韩| 日韩中文字幕视频在线观看| 日韩不卡在线播放| 欧美日韩国产综合视频在线观看| 中文字幕日韩欧美在线| 日韩欧美中文第一页| 国产日韩av一区二区| 国产传媒久久久| 91蜜桃婷婷狠狠久久综合9色| 91精品国产91久久久久久不卡 | 国产在线黄色| 日韩va亚洲va欧洲va国产| 国产欧美日韩视频在线| 欧美性生交大片免费| 九九精品调教| 国产一区深夜福利| 欧美一级一级性生活免费录像| 美女在线视频一区| 欧美二区在线观看| 交视频在线观看国产| 在线日韩中文字幕| 久久精品国产视频| 欧美日韩亚洲国内综合网| 欧美日韩国产综合视频在线观看中文 | 国产区在线看| 国产一级免费| 国产福利久久久| 亚洲乱码中文字幕综合| 国产超级va在线视频| 久久久91精品| 999视频精品| 日韩精品视频网站| 午夜福利一区二区三区| 国产免费电影网站入口| 99综合精品久久| 中文字幕欧美在线| 中文在线不卡| 一区二区日韩av| 精品九九久久| 一区二区三区精品久久久| 精品对白一区国产伦| 视频一区日韩| 欧美久久一二三四区| 在线国产日本| 欧美日韩高清不卡| 狠狠色噜噜狠狠狠狠97| 欧美日韩国产综合网| 日韩三级高清在线| 香蕉av一区| 国产欧美日韩中文| 欧洲一级精品| 亚洲尤物av| 久久久91精品| 久久久99精品久久| 欧美日韩精品在线观看| 日韩在线小视频| 亚洲福利一区二区三区| 国内激情久久| av一区在线观看| 国产网站av| 日韩精品综合在线| 91av久久久| 国产区在线看| 国产视频1区| 一区二区三区视频网站| 久久久久久91| 国产三级第一页| 91精品视频观看| 欧美日韩免费不卡视频一区二区三区| 中文字幕日韩在线视频| 欧美成人二区| 九九视频精品免费| 日韩精品―中文字幕| 中文字幕视频在线免费欧美日韩综合在线看| 在线不卡一区二区| 视频一区中文字幕国产| 一区二区三区四区五区视频在线观看| 黄色国产在线| 国产亚洲人成a一在线v站| 国产一级视频| 日韩欧美一级视频| 日本亚洲欧美三级| 成人a在线观看| 日韩精品视频免费播放| 久久精品久久精品亚洲人| 亚洲福利一区二区三区| 欧美国产一区视频在线观看| 中文字幕亚洲乱码| 精品国产免费观看一区| 欧美色欧美亚洲高清在线视频| 国产欧美中文在线| 日韩在线小视频| 日韩三级在线播放| 91精品国产调教在线观看| 欧美日韩午夜在线视频| 欧美日韩精品免费看| 久久99久久久久| 国产欧美日韩精品在线观看| 免费在线视频一级不卡| 成年人看的羞羞网站| 精品国产99| 日韩国产成人精品| 欧美日韩三级一区| 欧美日韩第一| √新版天堂资源在线资源| 国产传媒久久久| 国产黄在线观看| 欧美日韩高清在线播放| 亚洲福利视频在线| 精品视频在线视频| 欧美日韩久久久| 日韩欧美一级视频| 欧美久久综合性欧美| 国产资源中文字幕| 亚洲成av人片| 日本国产在线视频| 91精品国产综合久久香蕉最新版| 91麻豆精品国产91久久久使用方法| 国产无套粉嫩白浆在线2022年| 国产www在线观看| 久久久精品国产99久久精品芒果| 欧美成人vr18sexvr| 九七久久人人| 日韩亚洲国产欧美| 国产日韩第一页v| 香蕉精品久久| 人人做人人澡人人爽欧美| 欧美中文字幕在线| 中文字幕欧美国内| 中文字幕 欧美 日韩| 中文字幕视频一区二区三区久| 欧美一级一级性生活免费录像| 国产欧美日韩三级| 欧美日韩国产一二三| 久久久99精品久久| 亚洲第一视频在线观看| √新版天堂资源在线资源| 欧美日韩中国免费专区在线看| 亚洲综合中文字幕在线| 黄色在线资源| 欧美自拍一区| www.尤物.com| 中文字幕在线精品| 免费视频久久| 91久久在线| aaa大片在线观看| 欧美日韩中文字幕在线| 亚洲免费看av| 日韩欧美在线网址| 在线视频你懂得一区| 一区二区精品| 欧美中日韩在线| 国产婷婷一区二区| 不卡福利视频| 欧美一级二级三级区| 欧美日韩久久久| 国产69精品久久久久孕妇国产69久久| 在线欧美日韩国产| 久久久久久久久综合| 一区二区91| 亚洲第一中文字幕在线观看| 国产123在线| 色综合婷婷久久| 日韩欧美中文字幕公布| 国产视频中文字幕| 高清一区二区| 二区三区中文字幕| 国产日韩中文在线| 一区在线视频观看| 国产三级中文字幕| 日本精品在线中文字幕| 国产激情久久久| 久久综合九色欧美综合狠狠| av三级在线播放| 92久久精品| 日韩欧美看国产| 欧美国产综合视频| 国产成人精品综合网站| 91www成人久久| 日韩视频不卡中文| 91久久视频| 精品一二三区| 日韩精品视频免费播放| 亚洲免费中文字幕| 日本亚洲欧美三级| 久久综合久久综合九色| 最新日韩中文字幕| 欧美日韩中文字幕综合视频| 1024国产在线| 亚洲一卡二卡在线观看| 高清1区2区| 亚洲欧美中文字幕| 不卡av免费在线| 一区免费在线| 日韩欧美综合在线| 国产最新在线| 日韩欧美亚洲国产一区| 1区2区在线| 美女免费视频一区| 日韩色在线观看| 久久人人88| 国产91久久久久| 搞黄在线观看| 日韩中文字幕在线观看视频| 最近高清中文在线字幕在线观看1| 日韩精品视频在线观看网址 | 激情五月综合| 国产免费久久| 日本亚洲视频在线| 亚洲欧美中文在线视频| 亚洲欧洲日韩精品在线| 香蕉av一区| 日韩不卡一二三区| 伊人国产视频| 91精品在线免费观看| 日本va欧美va精品发布| 国产一区不卡精品| 91精品国产综合久久久久久漫画| 国产永久在线观看| 在线中文免费视频| 国产欧美在线观看| 本道综合精品| 日韩精品不卡一区二区| 中文字幕在线观看播放| 福利一区二区| 亚洲成av人片| 7799精品视频天天看| 国产婷婷色一区二区三区| 国产一区在线精品| 日韩精品视频在线| 国产91久久久久| 亚洲乱码视频| 国产在线导航| 狠狠色综合色区| 欧美在线中文字幕| 精品极品三级久久久久| 欧美一级日韩一级| 在线中文免费视频| 亚洲 欧美 中文字幕| 91欧美日韩麻豆精品| 日本a级黄色| 欧美亚洲专区| 内射国产内射夫妻免费频道| 在线不卡一区二区| 粉嫩喷白浆久久| 日韩午夜一区| 亚洲欧美99| 久久夜色精品国产噜噜亚洲av| www.老鸭窝.com| 日韩精品久久久| 国产激情在线观看| 国产性一级片| 精品国产综合久久| 亚洲国产综合久久| 久久精品视频免费看| 久久91精品视频| 亚洲免费视频一区| 欧美综合精品| 日韩欧美看国产| va中文字幕| 色综合天天综合网国产成人综合天| 日韩高清不卡在线| 中文字幕在线欧美| 国产成人精品免费久久久久| 国产伦精品免费视频| 欧美日韩国产一区| 美女尤物久久精品| 亚洲免费福利视频| 在线亚洲免费| 国产在线拍偷自揄拍精品| 国产欧美日韩综合| 欧美日韩国产一二三| 日韩欧美综合视频| 欧美一级久久久久久久久大| 亚洲九九精品| 久本草在线中文字幕亚洲欧美| 亚洲女人天堂色在线7777| 福利一区二区| 午夜精品一区二区三区免费视频| 欧美日韩综合视频| 中文字幕2020第一页| 在线视频不卡国产V| 精品国产欧美| 深夜日韩欧美| 在线视频1区2区| 国产123在线| 精品视频久久| 中文字幕 日韩 欧美| 日韩视频精品在线观看| 蜜臀国产一区| 日韩视频在线观看一区| 国产欧美综合在线| 亚洲免费在线观看av| 免费视频一区三区| 一区二区视频在线| 久久激情一区| 一区二区精品区| 中文字幕视频在线观看| 欧美日韩在线三级| 国产一二三精品| 国产蜜臀在线| 欧美日韩在线观看一区| 精品播放一区二区| 亚洲一区资源| 欧美特黄一区| 亚洲成在线观看| 91精品国产日韩91久久久久久| 日韩欧美高清在线| 精品福利在线观看| 午夜精品免费视频| 精品999在线| 在线欧美一级视频| 亚洲电影中文字幕在线观看| 91精品国产亚洲| 色一区在线观看| 在线一区二区三区精品| 国产不卡一区二区在线观看| 欧美 中文字幕| 在线视频第一页| 日韩欧美中文字幕在线观看| 精品国产乱码一区二区| 精品乱人伦一区二区三区| 日韩精品手机在线| 欧美日韩国产一区在线| 日韩欧美中文在线视频| 亚洲 欧美综合在线网络| 国产蜜臀在线| 日韩一级在线免费观看| 日韩一级二级三级精品视频| 国产欧美日韩91| 亚洲乱码中文字幕| 欧美日韩亚洲第一| 刘玥91精选国产在线观看| 91精品国产综合久久久久久漫画 | 国产三级中文字幕| 免费国产h视频在线观看86| 91精品婷婷国产综合久久竹菊| 精品国产欧美| 视频一区三区| 国产一级久久久| 亚洲 欧美综合在线网络| 欧美日韩国产免费观看| 亚洲图片小说综合| 亚洲最新永久观看在线| 一本一道久久a久久精品综合蜜臀 一本一道综合狠狠老 | 国产成免费视频| 日本精品福利视频| 日韩一级网站| 午夜精品一区二区三区视频免费看| 日韩精品一二三四区| 日韩一级精品| 黄色一区二区在线| 日韩欧美在线网址| 日韩不卡在线观看| 欧美高清一级片在线| 国产在线观看精品| 国产高清精品二区| 国产婷婷色一区二区三区在线| 日韩一级免费视频| 樱花草www在线观看| 日韩国产成人精品| av免费观看国产| 搞黄在线观看| 精品视频久久| 视频一区不卡| 中文字幕 欧美日韩| 欧美不卡视频| 精品成人久久av| 日韩视频第二页| 国产日韩av一区| 日韩www在线| 国产日韩在线视频| 中文天堂资源在线| 欧美日韩一级黄| 91精品久久久久| 亚洲视频电影在线| 精品在线99| 午夜伊人狠狠久久| 第一页在线观看| 蜜桃久久av| 国产欧美日韩第一页| 日韩中文首页| 国产婷婷色一区二区三区在线| 日韩精品手机在线| 欧美国产一区视频在线观看| 国产在线精品国自产拍免费| 欧美日韩91| 91精品国产综合久久香蕉最新版| 欧美日韩一级片在线观看| 国产欧美日韩视频在线| 日韩精品资源二区在线|