濮阳杆衣贸易有限公司

主頁 > 知識庫 > 基于html5 canvas做批改作業(yè)的小插件

基于html5 canvas做批改作業(yè)的小插件

熱門標(biāo)簽:機(jī)器人外呼系統(tǒng)存在哪些能力 電話機(jī)器人黑斑馬免費(fèi) 高德地圖標(biāo)注地點(diǎn)糾錯(cuò) 電話機(jī)器人電銷系統(tǒng)掙話費(fèi) 只辦理400電話 南昌仁和怎么申請開通400電話 平?jīng)龅貓D標(biāo)注位置怎么弄 如何獲取地圖標(biāo)注客戶 拓展地圖標(biāo)注

今天公司有一個(gè)新的需求,就是要在返回的作業(yè)照片里面可以涂鴉批改,批改完后就連同批改后的照片上傳到服務(wù)器。這對我不怎么熟悉canvas的人來說是個(gè)挑戰(zhàn)。

需求分析

  1. 能進(jìn)行批改,就是相當(dāng)于畫筆
  2. 能進(jìn)行畫筆的撤回功能
  3. 能進(jìn)行全部畫筆的清除功能
  4. 可以轉(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)移動(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)

移動(dòng)鼠標(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)移動(dòng)事件
    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的域名會(huì)報(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之前不怎么會(huì)的,之后我細(xì)看了幾遍的api,我就可以上手去做功能了,并且在w3school看到的例子讓我覺得canvas真的很強(qiáng)大

到此這篇關(guān)于基于html5 canvas做批改作業(yè)的小插件的文章就介紹到這了,更多相關(guān)canvas 批改作業(yè)插件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!

標(biāo)簽:西藏 新疆 棗莊 遼源 漯河 池州 永州 青島

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《基于html5 canvas做批改作業(yè)的小插件》,本文關(guān)鍵詞  基于,html5,canvas,做,批改,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《基于html5 canvas做批改作業(yè)的小插件》相關(guān)的同類信息!
  • 本頁收集關(guān)于基于html5 canvas做批改作業(yè)的小插件的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    托克逊县| 北流市| 渝中区| 凤阳县| 合肥市| 德兴市| 葫芦岛市| 岐山县| 德保县| 汶上县| 永和县| 尖扎县| 堆龙德庆县| 西青区| 黔江区| 施甸县| 石阡县| 元谋县| 江孜县| 康乐县| 三原县| 白山市| 蛟河市| 股票| 正定县| 武城县| 于都县| 林州市| 鹤山市| 红原县| 金沙县| 泰宁县| 永年县| 定安县| 阳谷县| 新郑市| 河西区| 平阳县| 昭苏县| 灌南县| 类乌齐县|