這篇文章給大家分享的是有關(guān)基于html5中canvas做批改作業(yè)小插件的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
成都創(chuàng)新互聯(lián)公司是由多位在大型網(wǎng)絡(luò)公司、廣告設(shè)計(jì)公司的優(yōu)秀設(shè)計(jì)人員和策劃人員組成的一個(gè)具有豐富經(jīng)驗(yàn)的團(tuán)隊(duì),其中包括網(wǎng)站策劃、網(wǎng)頁美工、網(wǎng)站程序員、網(wǎng)頁設(shè)計(jì)師、平面廣告設(shè)計(jì)師、網(wǎng)絡(luò)營銷人員及形象策劃。承接:網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、網(wǎng)站改版、網(wǎng)頁設(shè)計(jì)制作、網(wǎng)站建設(shè)與維護(hù)、網(wǎng)絡(luò)推廣、數(shù)據(jù)庫開發(fā),以高性價(jià)比制作企業(yè)網(wǎng)站、行業(yè)門戶平臺等全方位的服務(wù)。
需求分析
能進(jìn)行批改,就是相當(dāng)于畫筆
能進(jìn)行畫筆的撤回功能
能進(jìn)行全部畫筆的清除功能
可以轉(zhuǎn)化畫筆的顏色
技術(shù)上的實(shí)現(xiàn)思路
在聽到這需求后的第一反應(yīng)就是用canvas來做,所以我在w3school閱讀了 canvas的API .
1.將圖片轉(zhuǎn)到canvas,用到API: drawImage()
2畫筆的實(shí)現(xiàn)
當(dāng)按下鼠標(biāo)(mousedown)記錄開始點(diǎn)startX, startY
當(dāng)移動鼠標(biāo)的時(shí)候(mousemove)就獲取當(dāng)前的鼠標(biāo)的坐標(biāo)e.clientX, e.clientY,獲取到了當(dāng)前的坐標(biāo)后,與上一個(gè)點(diǎn)的坐標(biāo)軸的左邊進(jìn)行連線(lineTo ),這樣就能畫出了一條橫線了
當(dāng)鼠標(biāo)松開左鍵(mouseup)時(shí)候,就清除mousemove的函數(shù)
3.清除功能:講原始的圖片再次用drawImage()函數(shù)來重置
4.撤回功能:在每次按下鼠標(biāo)那時(shí)候,用getImageData()函數(shù)獲取當(dāng)前的圖像記錄到數(shù)組里面,然后按撤回則使用putImageData()函數(shù)放在canvas
5.畫筆的顏色:在mousemove里面改變strokeStyle筆的顏色
代碼實(shí)現(xiàn)
移動鼠標(biāo)畫出線條的代碼
let self = this; this.canvasNode = document.createElement('canvas'); let styleString = this.utils.formatStyle(CANVAS_STYLE); // CANVAS_STYLE是canvas的樣式 this.canvasNode.setAttribute('id','canvas'); // 一定要設(shè)置這width 和 height let ratio = this.imgNode.width / this.imgNode.height, height = this.imgNode.height, width = this.imgNode.width; let tempWidth , tempHeight; // 按比例伸縮 if(ratio >= window.innerWidth / window.innerHeight){ if(width > window.innerWidth){ tempWidth = window.innerWidth; tempHeight = height * window.innerWidth / width; } else { tempWidth = width; tempHeight = height; } }else{ if(height > window.innerHeight){ tempWidth = width * window.innerHeight / width; tempHeight = window.innerHeight; }else{ tempWidth = width; tempHeight = height; } } this.canvasNode.height = tempHeight; this.canvasNode.width = tempWidth; styleString = Object.assign({'width': tempWidth, 'height': tempHeight}, CANVAS_STYLE); this.canvasNode.setAttribute('style', styleString); let ctx = this.canvasNode.getContext('2d'), startX = 0, startY = 0; let image = new Image() ; image.setAttribute("crossOrigin",'Anonymous') // 加時(shí)間戳因?yàn)檫@圖片的域名沒設(shè)置跨域https://www.jianshu.com/p/c3aa975923de image.src = this.imgNode.src + '?t=' + new Date().getTime(); image.height = tempHeight; image.width = tempWidth; image.onload = function(){ ctx.drawImage(image, 0, 0, tempWidth, tempHeight); } // 鼠標(biāo)移動事件 let mousemoveFn = function(e) { ctx.beginPath(); ctx.lineWidth = 3; ctx.strokeStyle = self.currentColor; if(startX == e.clientX - self.canvasNode.offsetLeft || startY === e.clientY - self.canvasNode.offsetTop ) return ctx.moveTo(startX,startY); ctx.lineTo(e.clientX - self.canvasNode.offsetLeft , e.clientY - self.canvasNode.offsetTop ); ctx.stroke(); startX = e.clientX - self.canvasNode.offsetLeft; startY = e.clientY - self.canvasNode.offsetTop ; // 37是header的高度 } // 鼠標(biāo)按下事件 this.canvasNode.addEventListener("mousedown",function(e){ startX = e.clientX - self.canvasNode.offsetLeft; startY = e.clientY - self.canvasNode.offsetTop ; // 如果在mouseup那里記錄 則在撤回時(shí)候要做多一個(gè)步驟 let imageData = ctx.getImageData(0,0, self.canvasNode.width, self.canvasNode.height); self.imageDataArray.push(imageData); // 這imageDataArray用來記錄畫筆的筆畫 self.canvasNode.addEventListener("mousemove", mousemoveFn, false); },false); this.canvasNode.addEventListener('mouseup', function(e){ self.canvasNode.removeEventListener('mousemove', mousemoveFn); }); this.bgNode.appendChild(this.canvasNode);
遇到的問題
1.圖片的跨域問題 因?yàn)檫@個(gè)域名只設(shè)置了192.168.6.*的跨域,所以我localhost的域名會報(bào)跨域的問題(只對192.168.6.*的跨域是同事告訴我的,不然我還在傻乎乎的查問題)
解決辦法:設(shè)置vue.congfig.js文件的dev下的host
2.圖片的按比例伸縮完按保存后圖片的尺寸變了 我用toDataURL()方法輸出的base64后的圖片尺寸變了。原因:在我把圖片draw上canvas上時(shí)候,用了上面代碼的圖片那比例伸縮的算法把圖片變小了,所以畫在canvas上的圖片也變小了...
解決辦法:(待解決)
總結(jié)
第一次接觸canvas與圖片相結(jié)合的功能,讓我熟悉了canvas的api
在遇到?jīng)]做過的功能之前,一定要先定下心來運(yùn)用你所知道的知識思考下有沒可行的方法,找到了突破點(diǎn)就可以做了
在你碰上不熟悉的知識時(shí)候,一定要先看api,我這canvas之前不怎么會的,之后我細(xì)看了幾遍的api,我就可以上手去做功能了,并且在w3school看到的例子讓我覺得canvas真的很強(qiáng)大
感謝各位的閱讀!關(guān)于“基于html5中canvas做批改作業(yè)小插件的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!