摘要:萬圣節到了,寫一個小例子了解一下畫圖方法,可以實現一些有趣的效果,動畫實現。移動路徑方法把路徑移動到畫布中指定點,不創建線條。實現初始畫布顯示文字萬圣節快樂閃電打雷反轉畫布重置畫布總結萬圣節快樂
萬圣節到了,寫一個小例子了解一下canvas畫圖方法,canvas可以實現一些有趣的效果,動畫實現。以一個簡單的頁面實現了解一下基礎的畫圖方法。
原文鏈接
canvas可以實現一些有趣的效果,動畫實現。以一個簡單的頁面實現了解一下基礎的畫圖方法。
效果萬圣節快樂 ^_^
預備知識let canvas = document.getElementById("canvas"); let context = canvas.getContext("2d");
## 開始路徑
context.beginPath();
beginPath()方法在畫布上開始一條繪制路徑,或重置當前的路徑。
移動路徑context.moveTo();
moveTo()方法把路徑移動到畫布中指定點,不創建線條。
添加線條context.lineTo();
lineTo()方法添加一個新點,在畫布中創建該點到指定點的線條。
畫圖drawImagecontext.drawImage(image,x,y);
drawImage()方法可以在畫布上繪制圖像、畫布或視頻,也可以繪制圖像的某些部分,增加/減少圖像的尺寸。
獲取像素數據context.getImageData(x,y,width,height);
getImageData()方法可以獲取畫布imageData對象,該對象指定了矩形的像素數據。
在imageData對象中每個像素都存在rgba值,以數組形式存儲在data屬性中。
放回像素數據context.putImageData(imageData,x,y);
putImageData()方法將獲取的圖像數據放回到畫布上。
實現 html## 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 = []; } //初始畫布 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("萬圣節快樂", 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); } //反轉畫布 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); } //重置畫布 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(); } })();
# 總結
萬圣節快樂?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92011.html
摘要:算法性能提升圖片算法處理實質原理其實是遍歷像素點,對像素點的值進行改造。而像素點的數量與圖片的大小尺寸成正向指數級增長,因此適當的縮放圖片源后再去處理,對性能的提升十分巨大。 引言: 本系列現在構思成以下4個部分: 基礎類型圖片處理技術之縮放、裁剪與旋轉(傳送門); 基礎類型圖片處理技術之圖片合成(傳送門); 基礎類型圖片處理技術之文字合成(傳送門); 算法類型圖片處理技術(傳送門)...
摘要:前言本文是接續系列教程的,主要是介紹顏色系統在中的應用。本來是與一起成文的,因為莫名其妙的字數限制只能分割放送了。提供可以獲取畫布上任何一個像素,并可以自由的操作他們。繪制指定的位置繪制對象的內容。 前言 本文是接續系列教程的extra1,主要是介紹顏色系統在canvas中的應用。 本來是與extra1一起成文的,因為segmentfault莫名其妙的字數限制bug只能分割放送了。 ...
摘要:前言本文是接續系列教程的,主要是介紹顏色系統在中的應用。本來是與一起成文的,因為莫名其妙的字數限制只能分割放送了。提供可以獲取畫布上任何一個像素,并可以自由的操作他們。繪制指定的位置繪制對象的內容。 前言 本文是接續系列教程的extra1,主要是介紹顏色系統在canvas中的應用。 本來是與extra1一起成文的,因為segmentfault莫名其妙的字數限制bug只能分割放送了。 ...
閱讀 3642·2021-11-23 09:51
閱讀 1990·2021-11-16 11:42
閱讀 3234·2021-11-08 13:20
閱讀 1097·2019-08-30 15:55
閱讀 2205·2019-08-30 10:59
閱讀 1239·2019-08-29 14:04
閱讀 1018·2019-08-29 12:41
閱讀 2006·2019-08-26 12:22