JavaScript?canvas?實(shí)現(xiàn)用代碼畫畫
引言
canvas是HTML的一個(gè)繪圖標(biāo)簽,與SVG用標(biāo)簽繪圖不同,canvas是通過(guò)Js代碼進(jìn)行圖形繪制,多用于移動(dòng)端分享海報(bào)繪制以及照片裁剪等場(chǎng)景。本文將結(jié)合部分canvas API介紹在Vue項(xiàng)目中如何使用canvas進(jìn)行簡(jiǎn)單的圖形繪制和圖片繪制。
第一部分:圖形繪制
畫畫第一步:準(zhǔn)備好畫布和畫筆
<templete>
<div>
<canvas id="my-canvas" width="400" height="400">
//注意:給canvas設(shè)置寬高是不用帶單位的,以像素為單位
</div>
</templete>
<script>
export default {
mounted() {//注意要在DOM元素渲染完后才能操作DOM
this.draw();
},
methods: {
draw() {
let canvas = document.getElementById('my-canvas');//獲取畫布
let ctx = canvas.getContext('2d');//獲取畫筆
//之后的操作都是基于ctx
}
</script>
畫畫第二步:給畫筆調(diào)個(gè)粗細(xì)
ctx.fill();//用粗的毛筆填充 ctx.stroke();//用細(xì)的鉛筆描邊
畫畫第三步:給畫筆沾點(diǎn)顏料
ctx.fillStyle = 'red' ctx.strokrStyle = 'blue'
畫畫第四步:描點(diǎn)畫圖
為了更好理解,把第二三步置前,實(shí)際繪制需先描點(diǎn),最后選擇呈現(xiàn)顏色和方式
描點(diǎn)多借助(x,y)坐標(biāo)實(shí)現(xiàn),而坐標(biāo)原點(diǎn)是canvas的左頂點(diǎn),向右和向下方向分別為x軸和y軸的正方向
(1)畫一個(gè)三角形
先描3個(gè)點(diǎn),然后把點(diǎn)連接起來(lái)就完事!
ctx.beginPath();//新建一條繪制路徑 ctx.moveTo(10, 10);//起點(diǎn) ctx.lineTo(60, 10);//向x軸延申10個(gè)像素 ctx.lineTo(60, 60);//向y軸延申10個(gè)像素 ctx.closePath();//關(guān)閉當(dāng)前路徑 ctx.strokeStyle = 'red';//設(shè)置畫筆顏色 ctx.stroke();//以描邊的方式把描點(diǎn)的位置鏈接起來(lái) //填充方式畫三角形 //ctx.fillStyle = 'blue';//設(shè)置顏色 //ctx.fill();//以填充的方式把描點(diǎn)的位置鏈接起來(lái)
效果如下圖


(2)畫一個(gè)矩形
如何快速畫出一個(gè)矩形?先繪制4個(gè)點(diǎn)嗎?大漏特漏?。?!canvas API里直接就有畫矩形的方法!一步到位,無(wú)需其他操作!
fillRect(x,y,width,height);//填充一個(gè)矩形 strokeRect(x,y,width,height);//描邊一個(gè)矩形 //參數(shù)x,y是起點(diǎn) //例子 ctx.fillRect(10,10,50,50);//填充一個(gè)矩形 ctx.strokeRect(70,10,50,50);//描邊一個(gè)矩形 //默認(rèn)顏色為黑色,可通過(guò)fillStyle/strokeStyle改顏色

(3)畫一個(gè)圓
arc(x, y, r, startAngle, endAngle, direction) //x,y為圓心,r為半徑,startAngle、endAngle分別代表開始角度和結(jié)束角度,direction代表方向,true為順時(shí)針,false為逆時(shí)針,不填默認(rèn)為true //例子 ctx.arc(100,100,20,0,2*Math.PI); ctx.stroke();//以描邊方式將點(diǎn)連接起來(lái)

(4)進(jìn)階:畫一個(gè)笑臉
ctx.beginPath(); ctx.arc(100, 100, 50, 0, 2 * Math.PI, true); ctx.moveTo(135, 100);//重新設(shè)置畫筆起點(diǎn) ctx.arc(100, 100, 35, 0, Math.PI, false); ctx.moveTo(90, 85); ctx.arc(85, 85, 5, 0, 2 * Math.PI, true); ctx.moveTo(120, 85); ctx.arc(115, 85, 5, 0, 2 * Math.PI, true); ctx.stroke();

畫畫第五步:署名
如何在canvas畫布上寫字呢?
fillText('文本',x,y,maxWidth);//x,y為文本繪制開始位置,maxWidth為最大寬度(可選參數(shù))
strokeText('文本',x,y,maxWidth);
font ='';//設(shè)置字體大小和字體樣式
//例子
ctx.font = '32px serif'
ctx.fillText('任嘉倫最帥',10,50)
ctx.strokeText('任國(guó)超也帥',10,100)

第二部分:圖片繪制
場(chǎng)景一:頁(yè)面中現(xiàn)有一張圖,需要你在canvas畫布上繪制出一張一模一樣的圖
ctx.drawImage(image, x, y,width,height)//image可以是img元素或Image構(gòu)造函數(shù)創(chuàng)建的屏幕外圖片對(duì)象,x,y為繪制的起始位置
//場(chǎng)景一
<template>
<div class="wrap-box">
<div class="canvas-content">
<canvas id="my-canvas" width="300" height="300"></canvas>
</div>
<div class="img-content">
<img src="../../assets/rjl.jpg" alt="" class="my-img">
</div>
</div>
</template>
<script>
export default {
mounted(){
this.drawPic()
},
methods:{
drawPic(){
//場(chǎng)景一
let canvas = document.getElementById("my-canvas");
let ctx = canvas.getContext('2d');
let img = document.querySelector('.my-img');
img.onload=function(){//為確保圖片資源加載完畢,需要在onload方法里繪制
ctx.drawImage(img,0,0,200,300);
}
}
}
}
</script>
<style scoped>
.wrap-box{
display: flex;
align-items: center;
padding:20px 0 0 50px;
}
#my-canvas{
border: 1px solid orange;
}
.img-content{
flex: 1;
}
.my-img{
width: 200px;
height: 300px;
}
</style>

場(chǎng)景二:圖片不存在頁(yè)面上,通過(guò)接口返回或fileReader對(duì)象獲取到src路徑參數(shù),如何把src指向的圖片資源繪制到canvas上?
//場(chǎng)景二關(guān)鍵代碼
<script>
export default {
mounted(){
this.drawPic()
},
methods:{
drawPic(){
//場(chǎng)景二
let img = new Image();//創(chuàng)建一個(gè)Image對(duì)象
img.src="xxx.png";//假設(shè)xxx.png是獲取的scr參數(shù)
img.onload = function(){//切記要在onload方法里繪制
ctx.drawImage(img,150,100,200,300);
}
}
}
}
</script>以上就是JavaScript canvas 實(shí)現(xiàn)用代碼畫畫的詳細(xì)內(nèi)容,更多關(guān)于JavaScript canvas 畫畫的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- JavaScript?Canvas實(shí)現(xiàn)兼容IE的兔子發(fā)射爆破動(dòng)圖特效
- Canvas中繪制Geojson數(shù)據(jù)示例詳解
- JS前端使用Canvas快速實(shí)現(xiàn)手勢(shì)解鎖特效
- JavaScript?Canvas實(shí)現(xiàn)噪點(diǎn)濾鏡回憶童年電視雪花屏
- JS前端可視化canvas動(dòng)畫原理及其推導(dǎo)實(shí)現(xiàn)
- JS前端使用canvas實(shí)現(xiàn)擴(kuò)展物體類和事件派發(fā)
- JS前端canvas交互實(shí)現(xiàn)拖拽旋轉(zhuǎn)及縮放示例
- JS技巧Canvas性能優(yōu)化臟矩形渲染實(shí)例詳解
相關(guān)文章
簡(jiǎn)單實(shí)現(xiàn)JS對(duì)dom操作封裝
這篇文章主要介紹了簡(jiǎn)單實(shí)現(xiàn)JS對(duì)dom操作封裝,需要的朋友可以參考下2015-12-12
Bootstrap Table從服務(wù)器加載數(shù)據(jù)進(jìn)行顯示的實(shí)現(xiàn)方法
Bootstrap-Table是一個(gè)Boostrap的表格插件,能夠?qū)SON數(shù)據(jù)直接顯示在表格中。接下來(lái)通過(guò)本文給大家分享Bootstrap Table從服務(wù)器加載數(shù)據(jù)進(jìn)行顯示的實(shí)現(xiàn)方法,感興趣的朋友一起看看吧2016-09-09
JS實(shí)現(xiàn)環(huán)形進(jìn)度條(從0到100%)效果
這篇文章主要介紹了JS實(shí)現(xiàn)環(huán)形進(jìn)度條(從0到100%)效果的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
javascript下拉框選項(xiàng)單擊事件的例子分享
這篇文章主要分享了一些javascript下拉框選項(xiàng)單擊事件的例子,以及在例子中遇到的問(wèn)題的解決方法,十分實(shí)用,推薦給小伙伴們參考下。2015-03-03

