# [JS30] Day.8 Fun with HTML5 Canvas ###### tags: `JS30` ## 任務 Task 使用`HTML Tag` `<canvas>`來做出畫布,並能在實現畫畫效果,並能改變顏色及筆畫粗細。 ==完成時間:0.5hr== ## 筆記 Note ### HTML `<canvas>` * 預設寬高為 `width = 300px` `height = 150px`,不打 `px` 也沒關係,因為他只能用 `px`。 * 可透過 `CSS` `JS` 來設定寬高,不過 `CSS` 設定時可能會造成圖片扭曲,最好還是用 `HTML` 、 `JS` 來設定。 ### JS * `getContext('2d')`:取得渲染環境及繪圖函數。 ```javascript= let canvas = document.querySelector('#canvas'); let ctx = canvas.getContext('2d'); ``` #### 繪圖函數: * ==矩形==: * `ctx.fillRect(x, y, width, height)`:畫出一個填滿的矩形。 * `ctx.strokeRect(x, y, width, height`:畫出一個矩形邊框。 * `ctx.clearRect(x, y, width, height)`:清除指定區域的內容,使其變為透明。 * ==畫線==: * `ctx.beginPath()`:產生一個新的路徑。 * `ctx.clostPath()`:結束一個路徑 * `ctx.stroke()`:劃出線的的邊框。 * `ctx.fill()`:填滿線圍出的形狀。 * `ctx.moveTo()`:指定畫筆的起點。 * `ctx.lineTo()`:從起點畫到指定位置。 * ==圓形==: * `ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise)`: * `x, y`代表圓心座標,`radius` 代表半徑。 * `startAngle`、`endAngle` 代表弧線上的起始與結束的弧度(不是角度喔!)。 * `anticlockwise` `true` 代表逆時針做圖,`false` 代表順時針做圖。 * ==顏色==: * `ctx.fillStyle = `:填滿圖案的顏色 * `ctx.storkStyle = `:勾勒圖案的線條顏色 * ==線條端點樣式==: * `ctx.lineWidth = `:設定線條的寬度。 * `ctx.linCap = `:設定線條結尾樣式。 * `ctx.linJoin = `:設定線條接合處樣式。 * 樣式參數:`butt`:方形|`round`:圓形|`square`:方形但高會超出寬的一半。 ![](https://i.imgur.com/ssPPJKQ.png) ## 想法 Idea :::warning :bulb: <font color=black>製做一個簡易的小畫家功能。 </font> ::: <iframe height="300" style="width: 100%;" scrolling="no" title="Paint with canvas" src="https://codepen.io/jim876633/embed/xxYBBxR?default-tab=result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"> See the Pen <a href="https://codepen.io/jim876633/pen/xxYBBxR"> Paint with canvas</a> by Jim (<a href="https://codepen.io/jim876633">@jim876633</a>) on <a href="https://codepen.io">CodePen</a>. </iframe> ### 方法 method #### 儲存 `canvas` 圖片的方法 * `canvas.toDataURl([type, encoderOption])` 可以取得圖片網址,`type` 可為圖片類型,預設為 `png` `encoderOption` 為畫值,範圍 `0~1`。 ```javascript= save.addEventListener("click", function () { let imageName = prompt("Please enter image name"); if(!imageName)return; let canvasDataURL = canvas.toDataURL(); let a = document.createElement("a"); a.href = canvasDataURL; a.download = imageName || "drawing"; a.click(); }); ```