千呼萬喚 HTML 5 (8) - 畫布(canvas)之繪製圖形

来源:http://www.cnblogs.com/shouce/archive/2016/05/26/5529611.html
-Advertisement-
Play Games

[索引頁][源碼下載] 千呼萬喚 HTML 5 (8) - 畫布(canvas)之繪製圖形 作者:webabcd 介紹HTML 5: 畫布(canvas)之繪製圖形 畫布 Demo - 畫布的基本概念及 Demo,canvas.getContext(), CanvasRenderingContext ...


[索引頁]
[源碼下載] 


千呼萬喚 HTML 5 (8) - 畫布(canvas)之繪製圖形



作者:webabcd



介紹
HTML 5: 畫布(canvas)之繪製圖形

  • 畫布 Demo - 畫布的基本概念及 Demo,canvas.getContext(), CanvasRenderingContext2D, canvas.width, canvas.height, canvas.toDataURL()
  • 在畫布上繪製矩形 - canvas.getContext(), fillRect(), fillStyle, lineWidth, strokeStyle, strokeRect(), clearRect()
  • 在畫布上繪製弧線(以路徑的方式)- beginPath(), arc(), fill(), stroke(), moveTo(), arcTo(), isPointInPath()
  • 在畫布上繪製曲線(以路徑的方式)- quadraticCurveTo(), bezierCurveTo()
  • 在畫布上繪製直線(以路徑的方式)- lineWidth, beginPath(), stroke(), moveTo(), lineTo(), lineCap, lineJoin, miterLimit, closePath()
  • 在畫布上繪製矩形(以路徑的方式)- rect()



示例
1、畫布 Demo | canvas.getContext(), CanvasRenderingContext2D, canvas.width, canvas.height, canvas.toDataURL()
canvas/demo.html

複製代碼
<!DOCTYPE HTML>
<html>
<head>
<title>畫布 Demo</title>
</head>
<body>
<canvas id="canvas" width="320" height="240" style="background-color: rgb(222, 222, 222)">
您的瀏覽器不支持 canvas 標簽
</canvas>
<br/>
<button type="button" onclick="demo();">Demo</button>

<br />
<img id="img" alt="" src="" />

<script type="text/javascript">

var canvas = document.getElementById('canvas')
if (canvas.getContext) {
alert(
"您的瀏覽器支持 canvas 標簽");
}
else {
alert(
"您的瀏覽器不支持 canvas 標簽");
}

/*
* canvas 標簽 - 畫布標簽
* getContext("2d") - 獲取畫布標簽上的 2D 上下文對象(CanvasRenderingContext2D 對象)
* width - 畫布的寬
* height - 畫布的高
* canvas.toDataURL(type) - 返回畫布數據,預設類型為 image/png
* type - 指定返回畫布數據的類型,比如可以指定為 image/jpeg,預設類型為 image/png
*
* CanvasRenderingContext2D - 畫布的 2D 上下文對象,其擁有多種繪製圖像的方法
* canvas - 上下文所對應的畫布
*/

var ctx = canvas.getContext('2d');
alert(ctx.canvas.id);

function demo() {

ctx.fillRect(
20, 20, 100, 100);

alert(
"width: " + canvas.width.toString());
alert(
"height: " + canvas.height.toString());

alert(canvas.toDataURL(
"image/jpeg"));
alert(canvas.toDataURL());
// image/png
document.getElementById("img").src = canvas.toDataURL();

}

</script>
</body>
</html>
複製代碼


2、繪製矩形 | canvas.getContext(), fillRect(), fillStyle, lineWidth, strokeStyle, strokeRect(), clearRect()
canvas/shape/rectangle.html

複製代碼
<!DOCTYPE HTML>
<html>
<head>
<title>在 canvas 上繪製矩形的 demo</title>
</head>
<body>
<canvas id="canvas" width="300" height="360" style="background-color: rgb(222, 222, 222)">
您的瀏覽器不支持 canvas 標簽
</canvas>
<br/>
<button type="button" onclick="drawIt();">在畫布上繪製一些矩形</button>
<button type="button" onclick="clearIt();">清除畫布</button>

<script type="text/javascript">

var canvas = document.getElementById('canvas')
if (canvas.getContext) {
alert(
"您的瀏覽器支持 canvas 標簽");
}
else {
alert(
"您的瀏覽器不支持 canvas 標簽");
}

/*
* canvas.getContext("2d") - 獲取畫布標簽上的 2D 上下文對象(HTML DOM CanvasRenderingContext2D 對象),其擁有多種繪製圖像的方法。
*/
var ctx = canvas.getContext('2d');

function drawIt() {

clearIt();

/*
* context.fillRect(x, y, w, h) - 繪製一個有填充色的矩形,預設填充色為 0x000000
* x - 矩形左上角的 x 坐標
* y - 矩形左上角的 y 坐標
* w - 矩形的寬
* h - 矩形的高
*/
ctx.fillRect(
0, 0, 100, 100);

/*
* context.fillStyle - 指定填充色的顏色值
*
* 顏色值示例如下:
* Color Name - "green"
* #rgb - "#0f0"
* #rrggbb = "#00ff00"
* rgb(0-255, 0-255, 0-255) - rgb(0, 255, 0)
* rgb(0.0%-100.0%, 0.0%-100.0%, 0.0%-100.0%) - rgb(0%, 100%, 0%)
* rgba(0-255, 0-255, 0-255, 0.0-1.0) - rgb(0, 255, 0, 1)
* rgba(0.0%-100.0%, 0.0%-100.0%, 0.0%-100.0%, 0.0-1.0) - rgb(0%, 100%, 0%, 1)
*/
ctx.fillStyle
= "#0f0";
ctx.fillRect(
120, 0, 100, 50);

/*
* context.lineWidth - 筆劃的寬度,預設值是 1.0。
* 註意看本 Demo,筆劃的寬度為 10,可以明顯的看出其中心線為筆劃的路徑,畫布外的圖像不予顯示
* context.strokeStyle - 指定筆劃的顏色值
* context.strokeRect(x, y, w, h) - 繪製一個不填充的矩形
* x - 矩形左上角的 x 坐標
* y - 矩形左上角的 y 坐標
* w - 矩形的寬
* h - 矩形的高
*/
ctx.lineWidth
= 10;
ctx.strokeStyle
= "rgb(0, 0, 0)";
ctx.strokeRect(
0, 120, 100, 100);

// 繪製一個填充色半透明的矩形
ctx.fillStyle = "rgba(0, 255, 0, 0.3)";
ctx.fillRect(
0, 240, 100, 100);
}

function clearIt() {
/*
* context.clearRect(x, y, w, h) - 將指定的矩形區域上的圖像全部清除
*/
ctx.clearRect(
0, 0, 300, 360);

ctx.fillStyle
= "Black";
ctx.strokeStyle
= "Black";
ctx.lineWidth
= 1;
}

</script>
</body>
</html>
複製代碼


3、路徑方式繪製 - 弧線 | beginPath(), arc(), fill(), stroke(), moveTo(), arcTo(), isPointInPath()
canvas/shape/path/arc.html

複製代碼
<!DOCTYPE HTML>
<html>
<head>
<title>以路徑的方式在 canvas 上繪製圓和弧的 demo</title>
</head>
<body>
<img alt="" src="arcTo.png" />
<br/>

<canvas id="canvas" width="260" height="360" style="background-color: rgb(222, 222, 222)">
您的瀏覽器不支持 canvas 標簽
</canvas>
<br />
<button type="button" onclick="drawIt();">在畫布上繪製一些圓和弧</button>
<button type="button" onclick="clearIt();">清除畫布</button>

<script type="text/javascript">

var ctx = document.getElementById('canvas').getContext('2d');

function drawIt() {

clearIt();

/*
* context.beginPath() - 準備繪製一條路徑
*
* context.arc(x, y, radius, startRadian, endRadian, anticlockwise) - 根據指定的參數繪製一條弧線
* x - 弧線的中心點的 x 坐標
* y - 弧線的中心點的 x 坐標
* radius - 弧線的半徑
* startRadian - 弧線起始點的弧度(以 X 軸正半軸的三點鐘方向為弧度 0)
* endRadian - 弧線結束點的弧度(以 X 軸正半軸的三點鐘方向為弧度 0)
* anticlockwise - 是否以逆時針方向繪製路徑
*
* context.fill() - 使用當前的顏色或漸變色等來填充當前路徑的內部
*
* context.stroke() - 繪製當前路徑
*
* context.isPointInPath(x, y) - 判斷指定的點是否在當前路徑內
*/

// 繪製一個以黑色為填充色的圓形
ctx.beginPath();
ctx.arc(
50, 50, 50, 0, 2 * Math.PI, true);
ctx.fill();
alert(ctx.isPointInPath(
50, 50));

// 繪製一個以半透明藍色為填充色的圓形
ctx.beginPath();
ctx.fillStyle
= "rgba(0, 0, 255, 0.5)";
ctx.arc(
150, 50, 50, 0, 2 * Math.PI, true);
ctx.fill();

ctx.lineWidth
= 10;

// 演示按順時針方向繪製弧線(以 X 軸正半軸的三點鐘方向為弧度 0)
ctx.beginPath();
ctx.strokeStyle
= "rgb(0, 255, 0)";
ctx.arc(
50, 150, 50, 0, 1.5 * Math.PI, false);
ctx.stroke();

// 演示按逆時針方向繪製弧線(以 X 軸正半軸的三點鐘方向為弧度 0)
ctx.beginPath();
ctx.strokeStyle
= "rgb(0, 255, 0)";
ctx.arc(
150, 150, 50, 0, 1.5 * Math.PI, true);
ctx.stroke();

/*
* context.moveTo(x, y) - 新開一個路徑,並指定路徑的起點
*
* context.arcTo(x1, y1, x2, y2, radius) - 通過指定切點和半徑的方式繪製弧線。
* x1, y1 - 路徑當前點與 (x1, y1) 的連接線為弧線起點的切線。詳見圖片 arcTo.png
* x2, y2 - (x1, y1) 與 (x2, y2) 的連接線為弧線終點的切線,此切點即為弧線的終點。詳見圖片 arcTo.png
* radius - 弧線半徑
*/
ctx.beginPath();
ctx.strokeStyle
= "rgb(0, 0, 255)";
ctx.moveTo(
50, 250);
ctx.arcTo(
150, 250, 150, 1000, 50);
ctx.stroke();
}

function clearIt() {
ctx.clearRect(
0, 0, 260, 360);

ctx.fillStyle
= "Black";
ctx.strokeStyle
= "Black";
ctx.lineWidth
= 1;
}

</script>
</body>
</html>
複製代碼


4、路徑方式繪製 - 曲線 | quadraticCurveTo(), bezierCurveTo()
canvas/shape/path/curve.html

複製代碼
<!DOCTYPE HTML>
<html>
<head>
<title>以路徑的方式在 canvas 上繪製曲線的 demo</title>
</head>
<body>
<img alt="" src="curve.png" />
<br/>
<img alt="" src="curve_quadratic.gif" />
<br/>
<img alt="" src="curve_bezier.gif" />
<br/>

<canvas id="canvas" width="260" height="300" style="background-color: rgb(222, 222, 222)">
您的瀏覽器不支持 canvas 標簽
</canvas>
<br/>
<button type="button" onclick="drawIt();">在畫布上繪製一些曲線</button>
<button type="button" onclick="clearIt();">清除畫布</button>

<script type="text/javascript">

var ctx = document.getElementById('canvas').getContext('2d');

function drawIt() {

clearIt();

/*
* context.quadraticCurveTo(cpX, cpY, x, y) - 以當前點為曲線起點,按指定的參數繪製二次方貝塞爾曲線。見圖 curve.png, curve_bezier.gif
* cpX - 控制點的 x 軸坐標
* cpY - 控制點的 y 軸坐標
* x - 曲線終點的 x 軸坐標
* y - 曲線終點的 y 軸坐標
*/
ctx.beginPath();
ctx.moveTo(
20, 100);
ctx.quadraticCurveTo(
40, 20, 180, 100);
ctx.stroke();

/*
* context.bezierCurveTo(cpX1, cpY1, cpX2, cpY2, x, y) - 以當前點為曲線起點,按指定的參數繪製三次方貝塞爾曲線。見圖 curve.png, curve_quadratic.gif
* cpX1 - 和曲線起點相關連的控制點的 x 軸坐標
* cpY1 - 和曲線起點相關連的控制點的 y 軸坐標
* cpX2 - 和曲線終點相關連的控制點的 x 軸坐標
* cpY2 - 和曲線終點相關連的控制點的 y 軸坐標
* x - 曲線終點的 x 軸坐標
* y - 曲線終點的 y 軸坐標
*/
ctx.beginPath();
ctx.moveTo(
20, 200);
ctx.bezierCurveTo(
0, 160, 160, 120, 180, 200);
ctx.stroke();
}

function clearIt() {
ctx.clearRect(
0, 0, 260, 300);
}
</script>
</body>
</html>
複製代碼


5、路徑方式繪製 - 直線 | lineWidth, beginPath(), stroke(), moveTo(), lineTo(), lineCap, lineJoin, miterLimit, closePath()
canvas/shape/path/line.html

複製代碼
<!DOCTYPE HTML>
<html>
<head>
<title>以路徑的方式在 canvas 上繪製直線的 demo</title>
</head>
<body>
<canvas id="canvas" width="340" height="300" style="background-color: rgb(222, 222, 222)">
您的瀏覽器不支持 canvas 標簽
</canvas>
<br/>
<button type="button" onclick="drawIt();">在畫布上繪製一些直線</button>
<button type="button" onclick="clearIt();">清除畫布</button>

<script type="text/javascript">

var ctx = document.getElementById('canvas').getContext('2d');

function drawIt() {

clearIt();

ctx.strokeStyle
= 'Green';

/*
* context.lineWidth - 筆劃的寬度,預設值是 1.0
*/
ctx.lineWidth
= 10;

/*
* context.beginPath() - 準備繪製一條路徑
* context.stroke() - 繪製當前路徑
* context.moveTo(x, y) - 新開一個路徑,並指定路徑的起點
* context.lineTo(x, y) - 將當前點與指定的點用一條筆直的路徑連接起來
*/
ctx.beginPath();
ctx.moveTo(
20, 20);
ctx.lineTo(
200, 20);
ctx.stroke();

/*
* context.lineCap - 指定線條末端的繪製方式
* round - 線條末端有一個半圓形線帽
* square - 線條末端有一個矩形線帽
* butt - 線條末端無任何特殊處理,此值為預設值
*/
ctx.beginPath();
ctx.lineCap
= "round";
ctx.moveTo(
20, 40);
ctx.lineTo(
200, 40);
ctx.stroke();

ctx.beginPath();
ctx.lineCap
= "square";
ctx.moveTo(
20, 60);
ctx.lineTo(
200, 60);
ctx.stroke();

ctx.beginPath();
ctx.lineCap
= "butt";
ctx.moveTo(
20, 80);
ctx.lineTo(
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、首先我們必須弄清楚什麼是冒泡排序,不理解冒泡排序的原理,我們就無法寫出代碼。 冒泡排序(BubbleSort)的基本概念是:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續, ...
  • 在使用Qt開發時,肯定是想讓開發的項目界面統一風格;不希望每個界面都要程式員用代碼去修飾美化以及進行事件處理等等,這樣非常繁瑣,容易出錯而且沒有格調;所以我就開發一個動態鏈接庫,封裝統一的風格界面、事件處理等等;自己開發的這個庫叫做CQU;CQU庫最終提供給用戶的文件只有如下三個文件: CQU.dl ...
  • 1.Appfuse是個什麼鬼? AppFuse是一個集成了當前最流行的Web應用框架的一個更高層次的Web開發框架。換句話說,AppFuse就是一個完整的各主流框架的整合版本。AppFuse總是能夠緊隨java的主流技術框架。 2.使用AppFuse的環境要求 JDK1.7+ MySQL5.5+ m ...
  • 第一次系統的學習數據結構是在半年前,看小甲魚的數據結構與演算法視頻,自學的話有許多不懂得地方,什麼AVL樹,紅黑樹,圖的最短路徑,最小生成樹...但總歸對數據結構與演算法有一個大體的印象,到現在隨著不斷寫代碼,做OJ題,愈發認識到數據結構與演算法的重要性,打算再看一遍,現在看著:大話數據結構(程傑著),數 ...
  • 最好用的離線markdown編輯器Haroopad介紹 經常寫技術文檔,需要將文檔像代碼一樣管理,例如可以提交SVN或者GIT,可以比對歷史差異。用WORD之類的工具,文檔不是純文本,沒法滿足需求。用簡單文本沒有格式不美觀。Latex最強大,但是對於一般文檔撰寫又太重量,配置一個好的模板太費神,而且 ...
  • 分頁在後臺管理中是經常使用的功能,分頁顯示方便大量數據的管理。 實例代碼如下: ...
  • 所謂內置方法,就是凡是字元串都能用的方法,這個方法在創建字元串的類中,下麵是總結: 首先,我們要學習一個獲取幫助的內置函數 help(對象) ,對象可以是一個我們創建出來的,也可以是創建對象的那個類,類也是一個對象,被稱為類對象。 當我們進入解釋器的交互模式中輸入以下代碼時: 其中,str就是創建字 ...
  • 一道有趣的erlang建模練習 領域建模在於不斷挖掘領域的本質,然後用優秀的代碼簡潔地表現出來。而函數式非常適合將領域映射到數學本質上。前一陣子學習erlang,用erlang做了一些練習,分享其中的一個。 practice 1 : count tiangle 題目: 數數如下圖形中一共包含多少三角 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...