1.概述
Canvas API(畫布)用於在網頁實時生成圖像,並且可以操作圖像內容,基本上它是一個可以用JavaScript操作的點陣圖(bitmap)。使用前,首先需要新建一個
<canvas id="myCanvas" width="400" height="200"> 您的浏览器不支持canvas!</canvas>
上面程式碼中,如果瀏覽器不支援這個API,就會顯示
每個canvas節點都有一個對應的context物件(上下文物件),Canvas API定義在這個context物件上面,所以需要取得這個對象,方法是使用getContext方法。
var canvas = document.getElementById('myCanvas'); if (canvas.getContext) { var ctx = canvas.getContext('2d'); }
上面程式碼中,getContext方法指定參數2d,表示該canvas節點用於產生2D圖案(即平面圖案)。如果參數是webgl,就表示用於產生3D影像(即立體圖案),這部分其實單獨叫做WebGL API。
2.繪圖方法
canvas畫布提供了一個用來作圖的平面空間,該空間的每個點都有自己的座標,x表示橫座標,y表示垂直座標。原點(0, 0)位於影像左上角,x軸的正向是原點向右,y軸的正向是原點向下。
(1)繪製路徑
beginPath方法表示開始繪製路徑,moveTo(x, y)方法設定線段的起點,lineTo(x, y)方法設定線段的終點,stroke方法用來為透明的線段著色。
ctx.beginPath(); // 开始路径绘制 ctx.moveTo(20, 20); // 设置路径起点,坐标为(20,20) ctx.lineTo(200, 20); // 绘制一条到(200,20)的直线 ctx.lineWidth = 1.0; // 设置线宽 ctx.strokeStyle = '#CC0000'; // 设置线的颜色 ctx.stroke(); // 进行线的着色,这时整条线才变得可见
moveto和lineto方法可以多次使用。最後,也可以使用closePath方法,自動繪製一條當前點到起點的直線,形成一個封閉圖形,省卻使用一次lineto方法。
(2)繪製矩形
fillRect(x, y, width, height)方法用來繪製矩形,它的四個參數分別為矩形左上角頂點的x座標、y座標,以及矩形的寬和高。 fillStyle屬性用來設定矩形的填滿色。
ctx.fillStyle = 'yellow'; ctx.fillRect(50, 50, 200, 100);
strokeRect方法與fillRect類似,用來繪製空心矩形。
ctx.strokeRect(10,10,200,100);
clearRect方法用來清除某個矩形區域的內容。
ctx.clearRect(100,50,50,50);
(3)繪製文本
fillText(string, x, y) 用來繪製文本,它的三個參數分別為文本內容、起點的x座標、y座標。使用前,需先用font設定字體、大小、樣式(寫法類似與CSS的font屬性)。與此類似的還有strokeText方法,用來加入空心字。
ctx.font = "Bold 20px Arial"; // 设置字体 ctx.textAlign = "left";// 设置对齐方式 ctx.fillStyle = "#008600"; // 设置填充颜色 ctx.fillText("Hello!", 10, 50); // 设置字体内容,以及在画布上的位置 ctx.strokeText("Hello!", 10, 100); // 绘制空心字
fillText方法不支援文字斷行,即所有文字出現在一行內。所以,如果要產生多行文本,只有呼叫多次fillText方法。
(4)繪製圓形和扇形
arc方法用來繪製扇形。
ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);
arc方法的x和y參數是圓心座標,radius是半徑,startAngle和endAngle則是扇形的起始角度和終止角度(以弧度表示),anticlockwise表示做圖時應該逆時針畫(true)還是順時針畫(false)。
下面是如何繪製實心的圓形:
ctx.beginPath(); ctx.arc(60, 60, 50, 0, Math.PI*2, true); ctx.fillStyle = "#000000"; ctx.fill();
繪製空心圓形的例子:
ctx.beginPath(); ctx.arc(60, 60, 50, 0, Math.PI*2, true); ctx.lineWidth = 1.0; ctx.strokeStyle = "#000"; ctx.stroke();
(5)設定漸變色
createLinearGradient方法用來設定漸變色。
var myGradient = ctx.createLinearGradient(0, 0, 0, 160); myGradient.addColorStop(0, "#BABABA"); myGradient.addColorStop(1, "#636363");
createLinearGradient方法的參數是(x1, y1, x2, y2),其中x1和y1是起點座標,x2和y2是終點座標。透過不同的座標值,可以產生從上至下、從左到右的漸層等等。使用方法如下:
ctx.fillStyle = myGradient; ctx.fillRect(10,10,200,100);
(6)設定陰影
一系列與陰影相關的方法,可以用來設定陰影。
ctx.shadowOffsetX = 10; // 设置水平位移 ctx.shadowOffsetY = 10; // 设置垂直位移 ctx.shadowBlur = 5; // 设置模糊度 ctx.shadowColor = "rgba(0,0,0,0.5)"; // 设置阴影颜色 ctx.fillStyle = "#CC0000"; ctx.fillRect(10,10,200,100);
3.影像處理方法
drawImage方法
Canvas API 允許將影像檔案插入畫布,做法是讀取圖片後,使用drawImage方法在畫布內進行重繪。
var img = new Image(); img.src = 'image.png'; ctx.drawImage(img, 0, 0); // 设置对应的图像对象,以及它在画布上的位置
上面程式碼將一個PNG圖像載入畫布。 drawImage()方法接受三個參數,第一個參數是影像檔案的DOM元素(即節點),第二個和第三個參數是影像左上角在畫布中的座標,上例中的( 0, 0)就表示將影像左上角放置在畫布的左上角。
由於映像的載入需要時間,drawImage方法只能在映像完全載入後才能調用,因此上面的程式碼需要改寫。
var image = new Image(); image.onload = function() { var canvas = document.createElement('canvas'); canvas.width = image.width; canvas.height = image.height; canvas.getContext('2d').drawImage(image, 0, 0); // 插入页面底部 document.body.appendChild(image); return canvas; } image.src = 'image.png';
getImageData方法,putImageData方法
getImageData方法可以用來讀取Canvas的內容,傳回一個對象,包含了每個像素的資訊。
var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
imageData物件有一個data屬性,它的值是一個一維數組。此數組的值,依序為每個像素的紅、綠、藍、alpha通道值,因此該數組的長度等於 影像的像素寬度 x 影像的像素高度 x 4,每個值的範圍為0–255。這個數組不僅可讀,而且可寫,因此透過操作這個數組的值,就可以達到操作圖像的目的。修改這個陣列以後,使用putImageData方法將陣列內容重新繪製在Canvas上。
context.putImageData(imageData, 0, 0);
toDataURL方法
對影像資料做出修改以後,可以使用toDataURL方法,將Canvas資料重新轉換成一般的影像檔案形式。
function convertCanvasToImage(canvas) { var image = new Image(); image.src = canvas.toDataURL('image/png'); return image; }
上面的程式碼將Canvas數據,轉換成PNG data URI。
save方法,restore方法
save方法用於保存上下文環境,restore方法用於恢復到上一次保存的上下文環境
ctx.save(); ctx.shadowOffsetX = 10; ctx.shadowOffsetY = 10; ctx.shadowBlur = 5; ctx.shadowColor = 'rgba(0,0,0,0.5)'; ctx.fillStyle = '#CC0000'; ctx.fillRect(10,10,150,100); ctx.restore(); ctx.fillStyle = '#000000'; ctx.fillRect(180,10,150,100);
上面代码先用save方法,保存了当前设置,然后绘制了一个有阴影的矩形。接着,使用restore方法,恢复了保存前的设置,绘制了一个没有阴影的矩形。
4.动画
利用JavaScript,可以在canvas元素上很容易地产生动画效果。
var posX = 20, posY = 100; setInterval(function() { context.fillStyle = "black"; context.fillRect(0,0,canvas.width, canvas.height); posX += 1; posY += 0.25; context.beginPath(); context.fillStyle = "white"; context.arc(posX, posY, 10, 0, Math.PI*2, true); context.closePath(); context.fill(); }, 30);
上面代码会产生一个小圆点,每隔30毫秒就向右下方移动的效果。setInterval函数的一开始,之所以要将画布重新渲染黑色底色,是为了抹去上一步的小圆点。
通过设置圆心坐标,可以产生各种运动轨迹。
先上升后下降。
var vx = 10, vy = -10, gravity = 1; setInterval(function() { posX += vx; posY += vy; vy += gravity; // ... });
上面代码中,x坐标始终增大,表示持续向右运动。y坐标先变小,然后在重力作用下,不断增大,表示先上升后下降。小球不断反弹后,逐步趋于静止。
var vx = 10, vy = -10, gravity = 1; setInterval(function() { posX += vx; posY += vy; if (posY > canvas.height * 0.75) { vy *= -0.6; vx *= 0.75; posY = canvas.height * 0.75; } vy += gravity; // ... });
上面代码表示,一旦小球的y坐标处于屏幕下方75%的位置,向x轴移动的速度变为原来的75%,而向y轴反弹上一次反弹高度的40%。
5.像素处理
通过getImageData方法和putImageData方法,可以处理每个像素,进而操作图像内容。假定filter是一个处理像素的函数,那么整个对Canvas的处理流程,可以用下面的代码表示。
if (canvas.width > 0 && canvas.height > 0) { var imageData = context.getImageData(0, 0, canvas.width, canvas.height); filter(imageData); context.putImageData(imageData, 0, 0); }
以下是几种常见的处理方法:
灰度效果
灰度图(grayscale)就是取红、绿、蓝三个像素值的算术平均值,这实际上将图像转成了黑白形式。假定d[i]是像素数组中一个象素的红色值,则d[i+1]为绿色值,d[i+2]为蓝色值,d[i+3]就是alpha通道值。转成灰度的算法,就是将红、绿、蓝三个值相加后除以3,再将结果写回数组。
grayscale = function (pixels) { var d = pixels.data; for (var i = 0; i < d.length; i += 4) { var r = d[i]; var g = d[i + 1]; var b = d[i + 2]; d[i] = d[i + 1] = d[i + 2] = (r+g+b)/3; } return pixels; };
复古效果
复古效果(sepia)则是将红、绿、蓝三个像素,分别取这三个值的某种加权平均值,使得图像有一种古旧的效果。
sepia = function (pixels) { var d = pixels.data; for (var i = 0; i < d.length; i += 4) { var r = d[i]; var g = d[i + 1]; var b = d[i + 2]; d[i] = (r * 0.393)+(g * 0.769)+(b * 0.189); // red d[i + 1] = (r * 0.349)+(g * 0.686)+(b * 0.168); // green d[i + 2] = (r * 0.272)+(g * 0.534)+(b * 0.131); // blue } return pixels; };
红色蒙版效果
红色蒙版指的是,让图像呈现一种偏红的效果。算法是将红色通道设为红、绿、蓝三个值的平均值,而将绿色通道和蓝色通道都设为0。
red = function (pixels) { var d = pixels.data; for (var i = 0; i < d.length; i += 4) { var r = d[i]; var g = d[i + 1]; var b = d[i + 2]; d[i] = (r+g+b)/3; // 红色通道取平均值 d[i + 1] = d[i + 2] = 0; // 绿色通道和蓝色通道都设为0 } return pixels; };
亮度效果
亮度效果(brightness)是指让图像变得更亮或更暗。算法将红色通道、绿色通道、蓝色通道,同时加上一个正值或负值。
brightness = function (pixels, delta) { var d = pixels.data; for (var i = 0; i < d.length; i += 4) { d[i] += delta; // red d[i + 1] += delta; // green d[i + 2] += delta; // blue } return pixels; };
反转效果
反转效果(invert)是指图片呈现一种色彩颠倒的效果。算法为红、绿、蓝通道都取各自的相反值(255-原值)。
invert = function (pixels) { var d = pixels.data; for (var i = 0; i < d.length; i += 4) { d[i] = 255 - d[i]; d[i+1] = 255 - d[i + 1]; d[i+2] = 255 - d[i + 2]; } return pixels; };

本文討論了HTML&lt; Progress&gt;元素,其目的,樣式和與&lt; meter&gt;元素。主要重點是使用&lt; progress&gt;為了完成任務和LT;儀表&gt;對於stati

本文討論了html&lt; datalist&gt;元素,通過提供自動完整建議,改善用戶體驗並減少錯誤來增強表格。Character計數:159

本文討論了HTML&lt; meter&gt;元素,用於在一個範圍內顯示標量或分數值及其在Web開發中的常見應用。它區分了&lt; meter&gt;從&lt; progress&gt;和前

本文討論了視口元標籤,這對於移動設備上的響應式Web設計至關重要。它解釋瞭如何正確使用確保最佳的內容縮放和用戶交互,而濫用可能會導致設計和可訪問性問題。

本文討論了使用HTML5表單驗證屬性,例如必需的,圖案,最小,最大和長度限制,以直接在瀏覽器中驗證用戶輸入。

本文解釋了HTML5&lt; time&gt;語義日期/時間表示的元素。 它強調了DateTime屬性對機器可讀性(ISO 8601格式)的重要性,並在人類可讀文本旁邊,增強Accessibilit

本文討論了&lt; iframe&gt;將外部內容嵌入網頁,其常見用途,安全風險以及諸如對象標籤和API等替代方案的目的。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

WebStorm Mac版
好用的JavaScript開發工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載
最受歡迎的的開源編輯器