萬(wàn)圣節(jié)動(dòng)畫(huà)-canvas像素點(diǎn)

萬(wàn)圣節(jié)到了泞莉,寫(xiě)一個(gè)小例子了解一下canvas畫(huà)圖方法并扇。



原文鏈接

canvas可以實(shí)現(xiàn)一些有趣的效果,動(dòng)畫(huà)實(shí)現(xiàn)寞秃。以一個(gè)簡(jiǎn)單的頁(yè)面實(shí)現(xiàn)了解一下基礎(chǔ)的畫(huà)圖方法。

效果

萬(wàn)圣節(jié)快樂(lè)

預(yù)備知識(shí)

let canvas = document.getElementById('canvas');
let context = canvas.getContext('2d');

開(kāi)始路徑

context.beginPath();

beginPath()方法在畫(huà)布上開(kāi)始一條繪制路徑单芜,或重置當(dāng)前的路徑蜕该。

移動(dòng)路徑

context.moveTo();

moveTo()方法把路徑移動(dòng)到畫(huà)布中指定點(diǎn),不創(chuàng)建線條洲鸠。

添加線條

context.lineTo();

lineTo()方法添加一個(gè)新點(diǎn)堂淡,在畫(huà)布中創(chuàng)建該點(diǎn)到指定點(diǎn)的線條馋缅。

畫(huà)圖drawImage

context.drawImage(image,x,y);

drawImage()方法可以在畫(huà)布上繪制圖像、畫(huà)布或視頻绢淀,也可以繪制圖像的某些部分萤悴,增加/減少圖像的尺寸。

獲取像素?cái)?shù)據(jù)

context.getImageData(x,y,width,height);

getImageData()方法可以獲取畫(huà)布imageData對(duì)象皆的,該對(duì)象指定了矩形的像素?cái)?shù)據(jù)覆履。

在imageData對(duì)象中每個(gè)像素都存在rgba值,以數(shù)組形式存儲(chǔ)在data屬性中费薄。

放回像素?cái)?shù)據(jù)

context.putImageData(imageData,x,y);

putImageData()方法將獲取的圖像數(shù)據(jù)放回到畫(huà)布上硝全。

實(shí)現(xiàn)

html

<canvas id="canvas"></canvas>
<button id="click" class="switch">Click</button>

css

html,
body,
canvas {
    width: 100%;
    height: 100%;
    margin: 0;
}

.switch {
    position: absolute;
    top: 70%;
    right: 10%;
    width: 50px;
    height: 50px;
    border-radius: 50px;
    outline: none;
    cursor: pointer;
    animation: switch-animate alternate infinite ease 1s 0s;
}

@keyframes switch-animate {
    from {
        box-shadow: 0 0 30px #ece9c5;
    }

    to {
        box-shadow: 0 0 100px #eae5a7;
    }
}    

js

(function () {

    class Halloween {
        constructor(id) {
            this.canvas = document.getElementById(id);
            this.ctx = this.canvas.getContext('2d');
            this.w = this.canvas.width;
            this.h = this.canvas.height;
            this.data = [];
        }

        //初始畫(huà)布
        initDraw(img) {
            this.w = this.canvas.width = img.width;
            this.h = this.canvas.height = img.height;
            this.ctx.drawImage(img, 0, 0);
            this.data = this.ctx.getImageData(0, 0, this.w, this.h);
        }

        //顯示文字
        drawText() {
            this.ctx.font = '60px Verdana';
            this.ctx.fillStyle = '#ffffff';
            this.ctx.fillText('萬(wàn)圣節(jié)快樂(lè)', 350, 280);
        }

        //閃電
        lightning() {
            let ctx = this.ctx;
            ctx.strokeStyle = '#fff';
            ctx.lineWidth = 2;
            ctx.beginPath();
            ctx.moveTo(800, 10);
            ctx.lineTo(600, 100);
            ctx.lineTo(500, 200);
            ctx.stroke();
            ctx.beginPath();
            ctx.moveTo(600, 100);
            ctx.lineTo(650, 170);
            ctx.stroke()
        }

        //打雷
        thunder() {
            let timer = Math.floor(800 * Math.random());
            this.reverse();
            this.lightning();
            this.drawText();
            setTimeout(() => {
                this.reset();
            }, timer);
        }

        //反轉(zhuǎn)畫(huà)布
        reverse() {
            let imgData = this.ctx.getImageData(0, 0, this.w, this.h);
            for (var i = 0, len = imgData.data.length; i < len; i += 4) {
                imgData.data[i] = 255 - imgData.data[i];
                imgData.data[i + 1] = 255 - imgData.data[i + 1];
                imgData.data[i + 2] = 255 - imgData.data[i + 2];
                imgData.data[i + 3] = 255;
            }
            this.ctx.putImageData(imgData, 0, 0);
        }

        //重置畫(huà)布
        reset() {
            this.ctx.putImageData(this.data, 0, 0);
        }
    }


    let halloween = new Halloween('canvas');
    let canvas = document.getElementById('canvas');
    let ctx = canvas.getContext('2d');
    let img = new Image();
    img.src = '/images/halloween.png';
    img.onload = () => {
        halloween.initDraw(img);
    }

    document.getElementById('click').onclick = () => {
        halloween.thunder();
    }

})();

總結(jié)

萬(wàn)圣節(jié)快樂(lè)??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市楞抡,隨后出現(xiàn)的幾起案子伟众,更是在濱河造成了極大的恐慌,老刑警劉巖召廷,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凳厢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡竞慢,警方通過(guò)查閱死者的電腦和手機(jī)先紫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)筹煮,“玉大人遮精,你說(shuō)我怎么就攤上這事“芰剩” “怎么了仑鸥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)变屁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)意狠,這世上最難降的妖魔是什么粟关? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮环戈,結(jié)果婚禮上闷板,老公的妹妹穿的比我還像新娘。我一直安慰自己院塞,他們只是感情好遮晚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著拦止,像睡著了一般县遣。 火紅的嫁衣襯著肌膚如雪糜颠。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天萧求,我揣著相機(jī)與錄音其兴,去河邊找鬼。 笑死夸政,一個(gè)胖子當(dāng)著我的面吹牛元旬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播守问,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼匀归,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了耗帕?” 一聲冷哼從身側(cè)響起穆端,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兴垦,沒(méi)想到半個(gè)月后徙赢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡探越,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年狡赐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钦幔。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枕屉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鲤氢,到底是詐尸還是另有隱情搀擂,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布卷玉,位于F島的核電站哨颂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏相种。R本人自食惡果不足惜威恼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寝并。 院中可真熱鬧箫措,春花似錦、人聲如沸衬潦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)镀岛。三九已至弦牡,卻和暖如春友驮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喇伯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工喊儡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稻据。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓艾猜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親捻悯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子匆赃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一、簡(jiǎn)介 HTML5 中的定義:“它是依賴(lài)分辨率的位圖畫(huà)布今缚,你可以在 canvas 上面繪制任何圖形算柳,甚至加載照片...
    destiny0904閱讀 10,521評(píng)論 1 4
  • 一:canvas簡(jiǎn)介 1.1什么是canvas? ①:canvas是HTML5提供的一種新標(biāo)簽 ②:HTML5 ...
    GreenHand1閱讀 4,674評(píng)論 2 32
  • 線條樣式 繪制直線姓言,第五章知識(shí)簡(jiǎn)單回顧 lineWidth 設(shè)置或返回當(dāng)前的線條寬度瞬项,單位為像素 lineCap ...
    Zd_silent閱讀 472評(píng)論 0 0
  • 一、canvas簡(jiǎn)介 1.1 什么是canvas何荚?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個(gè)矩形區(qū)...
    Looog閱讀 3,940評(píng)論 3 40
  • 書(shū)中代碼示例效果展示:Core HTML5 Canvas Examples 基礎(chǔ)知識(shí) canvas元素 canva...
    szu_bee閱讀 2,810評(píng)論 2 28