成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 使用canvas一步步實現(xiàn)圖片打碼功能的方法

使用canvas一步步實現(xiàn)圖片打碼功能的方法

熱門標簽:智能電銷機器人被禁用了么 高德地圖標注商戶怎么標 電話機器人技術(shù) 如何查看地圖標注 ok電銷機器人 地圖標注軟件打印出來 黃石ai電銷機器人呼叫中心 惡搞電話機器人 欣鼎電銷機器人 效果

原文地址
https://github.com/MY729/front-common-funtion/blob/master/picture-code-demo/README.md

預(yù)覽地址
https://my729.github.io/front-common-funtion/picture-code-demo/picture-code.html

準備工作

demo 基于 vue + elelment-ui

首先創(chuàng)建一個html文件, 并引入 vue 和 elelment-ui(注意還有樣式文件)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <!-- elelment-ui樣式 -->
  <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
</head>
<body>
  
</body>
<!-- 引入vue -->
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<!-- 引入element-ui -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
</html>

接下來就可以寫我們的打碼功能啦

實現(xiàn)思路

  • 創(chuàng)建canvas畫布,并將要打碼的圖片繪制上去
  • 監(jiān)聽鼠標在圖片上的點擊,移動、松開事件,在canvas畫布上繪制要打碼的區(qū)域
  • 處理繪制的打碼區(qū)域
  • 保存打碼后的圖片

將要打碼的圖片繪制到canvas畫布上

// 初始化 繪制圖片
toCode (currentImg) {
  this.$nextTick(() => {
    // 獲取將要繪制的canvas的父元素節(jié)點
    let parentId = document.getElementById('parentId')
    // 初始化圖片
    let drawImg = new Image()
    drawImg.setAttribute('crossOrigin', 'anonymous')
    drawImg.crossOrigin = 'Anonymous'
    drawImg.src = currentImg
    // 創(chuàng)建canvas元素并添加到父節(jié)點中
    let addCanvas = document.createElement('canvas')
    parentId.appendChild(addCanvas)
    let canvas = parentId.lastElementChild
    canvas.id = 'imgCanvas'
    if (canvas.getContext) {
      let ctx = canvas.getContext('2d')
      // 繪制圖片
      drawImg.onload = function () {
        canvas.width = 720
        canvas.height = 500
        ctx.drawImage(drawImg, 0, 0, 720, 500)
      }
    }
  })
}

點擊打碼按鈕,繪制打碼區(qū)域

思路:

  • 鼠標點擊,獲取點擊時的坐標,每次點擊前可能會存在打過碼的區(qū)域,先清除畫布,重新繪制圖片
  • 鼠標移動,開始繪制打碼的矩形,通過移動的坐標和上面點擊的點坐標確定繪制的矩形坐標和寬高
  • 將繪制的打碼矩形,分割成一個個寬高15像素的小正方形,并給每個小正方形生產(chǎn)隨機顏色
  • 鼠標松開,停止繪制矩形
// 打碼
dialogCode (img) {
  let parentId = document.getElementById('parentId')
  let canvas = document.getElementById('imgCanvas')
  if (canvas.getContext) {
    let ctx = canvas.getContext('2d')
    let drawImage = new Image()
    drawImage.crossOrigin = 'Anonymous'
    drawImage.src = img
    drawImage.onload = () => {
      ctx.drawImage(drawImage, 0, 0, 720, 500)
    }
    // 鼠標點擊
    parentId.onmousedown = e => {
      ctx.clearRect(0, 0, canvas.width, canvas.height)
      ctx.drawImage(drawImage, 0, 0, 720, 500)
      this.flag = true
      this.clickX = e.offsetX // 鼠標點擊時的X
      this.clickY = e.offsetY // 鼠標點擊時的Y
    }
    // 鼠標松開
    parentId.onmouseup = () => {
      this.flag = false
    }
    // 鼠標按下
    parentId.onmousemove = e => {
      if (this.flag) {
        ctx.clearRect(0, 0, canvas.width, canvas.height)
        ctx.drawImage(drawImage, 0, 0, 720, 500)
        ctx.beginPath()
        let pixels = [] // 二維數(shù)組,每個子數(shù)組有5個值(繪制矩形左上角的X坐標、y坐標,矩形的寬、高,生成的4位隨機數(shù)用于顏色值)
        for (let x = 0; x < (e.offsetX - this.clickX) / 15; x++) {
          for (let y = 0; y < (e.offsetY - this.clickY) / 15; y++) {
            pixels.push([(x * 15 + this.clickX), (y * 15 + this.clickY), 15, 15, Math.floor(Math.random() * 9999)])
          }
          for (let y = 0; y > (e.offsetY - this.clickY) / 15; y--) {
            pixels.push([(x * 15 + this.clickX), (y * 15 + this.clickY), 15, 15, Math.floor(Math.random() * 9999)])
          }
        }
        for (let x = 0; x > (e.offsetX - this.clickX) / 15; x--) {
          for (let y = 0; y > (e.offsetY - this.clickY) / 15; y--) {
            pixels.push([(x * 15 + this.clickX), (y * 15 + this.clickY), 15, 15, Math.floor(Math.random() * 9999)])
          }
          for (let y = 0; y < (e.offsetY - this.clickY) / 15; y++) {
            pixels.push([(x * 15 + this.clickX), (y * 15 + this.clickY), 15, 15, Math.floor(Math.random() * 9999)])
          }
        }
        // 遍歷數(shù)組繪制小正方形塊
        for (let i = 0; i < pixels.length; i++) {
          ctx.fillStyle = '#bf' + pixels[i][4]
          ctx.fillRect(pixels[i][0], pixels[i][1], pixels[i][2], pixels[i][3])
        }
        ctx.fill()
        ctx.closePath()
      }
    }
  }
}

保存

// 保存
dialogUpload () {
  let canvas = document.getElementById('imgCanvas')
  let tempImg = canvas.toDataURL('image/png')
  let imgURL = document.getElementById('imgURL')
  imgURL.crossOrigin = 'Anonymous'
  imgURL.src = tempImg
}

源碼

復(fù)制到html文件可預(yù)覽

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>使用canvas一步步實現(xiàn)圖片打碼功能</title>
  <!-- elelment-ui樣式 -->
  <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
  <style type="text/css">
    .rc-code__buttons {
      margin: 20px;
    }
  </style>
</head>
<body>
  <div id="app">
    <div class="rc-code__buttons">
      <h1>vue項目中使用canvas一步步實現(xiàn)圖片打碼功能</h1>
      <el-button type="primary" @click="dialogCode(data.img_url)">打碼</el-button>
      <el-button type="success" @click="dialogUpload()">保存</el-button>
    </div>
    <el-row>
      <el-col :span="12"><h3>點擊打碼按鈕,在圖片上繪制打碼區(qū)域; 點擊保存,生成打碼后的圖片</h3></el-col>
      <el-col :span="12"><h3>保存后的圖片</h3></el-col>
      <el-col :span="12"><div id="parentId"></div></el-col>
      <el-col :span="12"><img id="imgURL"/></el-col>
    </el-row>
  </div>
</body>
<!-- 引入vue -->
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<!-- 引入element-ui -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script>
new Vue({
  el: '#app',
  data () {
    return {
      data: {
        img_url: 'https://avatars0.githubusercontent.com/u/26196557?s=460&v=4'
      },
      flag: false, // 是否繪制矩形
      clickX: '', // 開始繪制矩形時,鼠標點擊時的x坐標
      clickY: '' // 開始繪制矩形時,鼠標點擊時的y坐標
    }
  },
  mounted() {
    this.toCode(this.data.img_url)
  },
  methods: {
    // 初始化 繪制圖片
    toCode (currentImg) {
      this.$nextTick(() => {
        let parentId = document.getElementById('parentId')
        let drawImg = new Image()
        drawImg.setAttribute('crossOrigin', 'anonymous')
        drawImg.crossOrigin = 'Anonymous'
        drawImg.src = currentImg
        let addCanvas = document.createElement('canvas')
        parentId.appendChild(addCanvas)
        let canvas = parentId.lastElementChild
        canvas.id = 'imgCanvas'
        if (canvas.getContext) {
          let ctx = canvas.getContext('2d')
          drawImg.onload = function () {
            canvas.width = 720
            canvas.height = 500
            ctx.drawImage(drawImg, 0, 0, 720, 500)
          }
        }
      })
    },
    // 打碼
    dialogCode (img) {
      let parentId = document.getElementById('parentId')
      let canvas = document.getElementById('imgCanvas')
      if (canvas.getContext) {
        let ctx = canvas.getContext('2d')
        let drawImage = new Image()
        drawImage.crossOrigin = 'Anonymous'
        drawImage.src = img
        drawImage.onload = () => {
          ctx.drawImage(drawImage, 0, 0, 720, 500)
        }
        parentId.onmousedown = e => {
          ctx.clearRect(0, 0, canvas.width, canvas.height)
          ctx.drawImage(drawImage, 0, 0, 720, 500)
          this.flag = true
          this.clickX = e.offsetX // 鼠標點擊時的X
          this.clickY = e.offsetY // 鼠標點擊時的Y
        }
        parentId.onmouseup = () => {
          this.flag = false
        }
        parentId.onmousemove = e => {
          if (this.flag) {
            ctx.clearRect(0, 0, canvas.width, canvas.height)
            ctx.drawImage(drawImage, 0, 0, 720, 500)
            ctx.beginPath()
            let pixels = [] // 二維數(shù)組,每個子數(shù)組有5個值(繪制矩形左上角的X坐標、y坐標,矩形的寬、高,生成的4位隨機數(shù)用于顏色值)
            for (let x = 0; x < (e.offsetX - this.clickX) / 15; x++) {
              for (let y = 0; y < (e.offsetY - this.clickY) / 15; y++) {
                pixels.push([(x * 15 + this.clickX), (y * 15 + this.clickY), 15, 15, Math.floor(Math.random() * 9999)])
              }
              for (let y = 0; y > (e.offsetY - this.clickY) / 15; y--) {
                pixels.push([(x * 15 + this.clickX), (y * 15 + this.clickY), 15, 15, Math.floor(Math.random() * 9999)])
              }
            }
            for (let x = 0; x > (e.offsetX - this.clickX) / 15; x--) {
              for (let y = 0; y > (e.offsetY - this.clickY) / 15; y--) {
                pixels.push([(x * 15 + this.clickX), (y * 15 + this.clickY), 15, 15, Math.floor(Math.random() * 9999)])
              }
              for (let y = 0; y < (e.offsetY - this.clickY) / 15; y++) {
                pixels.push([(x * 15 + this.clickX), (y * 15 + this.clickY), 15, 15, Math.floor(Math.random() * 9999)])
              }
            }
            for (let i = 0; i < pixels.length; i++) {
              ctx.fillStyle = '#bf' + pixels[i][4]
              ctx.fillRect(pixels[i][0], pixels[i][1], pixels[i][2], pixels[i][3])
            }
            ctx.fill()
            ctx.closePath()
          }
        }
      }
    },
    // 保存
    dialogUpload () {
      let canvas = document.getElementById('imgCanvas')
      let tempImg = canvas.toDataURL('image/png')
      let imgURL = document.getElementById('imgURL')
      imgURL.crossOrigin = 'Anonymous'
      imgURL.src = tempImg
    }
  }
})
</script>
</html>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標簽:中山 阿壩 赤峰 萍鄉(xiāng) 金昌 盤錦 綏化 聊城

巨人網(wǎng)絡(luò)通訊聲明:本文標題《使用canvas一步步實現(xiàn)圖片打碼功能的方法》,本文關(guān)鍵詞  使用,canvas,一,步步,實現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《使用canvas一步步實現(xiàn)圖片打碼功能的方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于使用canvas一步步實現(xiàn)圖片打碼功能的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    午夜精品久久久久久不卡8050| 日韩一级中文字幕| 真实国产乱子伦精品一区二区三区| 天堂av一区二区三区在线播放| 国产视频在线观看网站| 嫩草黄色影院| 古典武侠综合av第一页| 波多野结衣成人在线| 成年丰满熟妇午夜免费视频| 男人天堂亚洲天堂| 欧美黄色大片网站| 久久免费成人精品视频| 欧美日韩国产一级| 国产一线在线观看| 区二区三区在线| 日本欧美在线视频免费观看| 日韩一区亚洲二区| 国产高清999| 欧美疯狂party性派对| 久久久精品欧美| 久久九九国产视频| 亚洲精品网站在线观看| 成人区人妻精品一区二| 国产成人精彩在线视频九色| jizz18女人高潮| 在线看片网址| 欧美另类老女人| 少妇高潮久久久| 国产98色在线|日韩| 欧美多人爱爱视频网站| 国产不卡在线视频| 亚洲第一视频| 欧美日韩在线电影| 国产精品人人做人人爽人人添| 99热在线免费观看| 日韩一二三区| 不卡高清视频专区| 欧美一区二区三区红桃小说| 欧美h版在线| av在线免费观看不卡| 国产精品日韩av| 青青一区二区三区| 69堂免费精品视频在线播放| 日韩精品久久| 一区二区三区国产视频| 麻豆一区二区三区四区精品蜜桃| 亚洲国产精彩中文乱码av| av中文在线资源| 日韩精品丝袜美腿| 亚洲第一黄色网址| 综合久久综合久久| 亚洲欧美国产一区二区| 国产综合18久久久久久| 今天的高清视频免费播放成人| 国产欧美精品日韩区二区麻豆天美| 日韩成人三级视频| 久久久男人的天堂| 日韩熟女精品一区二区三区| av在线亚洲男人的天堂| 国产寡妇树林野战在线播放| 日韩欧亚中文在线| 国产婷婷一区二区三区| 久久综合九色九九| 99久久www免费| 亚洲欧美一二三区| 亚洲最大黄色| 2019男人天堂| 天堂资源最新版在线视频观看免费网| 国产精品一区在线| 91国偷自产中文字幕久久| 香蕉国产精品偷在线观看不卡| 亚洲护士老师的毛茸茸最新章节| 国语自产精品视频在线看抢先版结局| 中文字幕日本最新乱码视频| 国产精品视频中文字幕91| 国产精品123区| 国产精品久久久久999| 成人国产精品一级毛片视频| 亚洲国产一区二区在线| 中文字幕一区二区三区视频| 成人精品小视频| 日本午夜免费福利视频| 91精品国产一区二区三密臀| 成人免费观看在线观看| 日本美女视频一区| 国产精品18久久久久久首页狼| 日韩Av无码精品| 精品国产乱码久久久久久1区2区| 日韩福利在线视频| 欧美日韩视频免费| 免费国产h视频在线观看86| 国产艳妇疯狂做爰视频| 日本精品视频| 同性恋视频网站资源| 激情综合丝袜美女一区二区| 中文av字幕在线观看| 黄网在线免费| 直接在线观看的三级网址| 日韩成人在线电影| 黄av在线播放| 人人精品久久| 性xxxx18| 热久久免费国产视频| 久久国产这里只有精品| 欧美女孩性生活视频| 九九综合九九综合| 国产在线观看不卡一区二区三区| 日本激情一区二区三区| 在线观看日产精品| 26uuu国产精品视频| 亚洲精品第一页| 亚洲青色在线| 久久精品日韩欧美| 国产伦精品一区二区三区免费| 久久久日本电影| 欧美成年人视频网站| 在线免费a视频| 女尊高h男高潮呻吟| 久久综合加勒比| 蜜桃免费在线视频| 四虎4545www精品视频| 黄色av网址在线| 国内一区二区三区| 97人人模人人爽人人澡| av资源在线免费观看| 欧美一级三级| 正在播放国产一区| 国产成人亚洲精品播放器下载| 日韩精品一区二区三区国语自制| 1024手机在线观看你懂的| 国产3级在线观看| 五月婷婷综合激情网| av在线综合网| 国内精品久久久久久久久| 国产对白在线播放| 国产精品视频26uuu| 激情视频亚洲| 久久久久蜜桃| 久久久久亚洲AV成人网人人小说| 中文一区一区三区免费| www.色就是色.com| 精品电影一区二区| 成人午夜激情| 国产精品精品| 日本欧美在线看| 国产日韩av在线| 成人午夜视频免费观看| 欧洲成人午夜精品无码区久久| 欧美xxxx做受欧美88bbw| 日韩av网址大全| 久久综合成人精品亚洲另类欧美| 日日狠狠久久| 天天做天天爱天天综合网2021| 亚洲最大的网站| 成人xxx免费视频播放| 97久精品国产片一区二区三区| 国产福利热线视频| 日本美女一区二区三区视频| 特色特色大片在线| 天天操天天操天天操| www.成人av| 久久久免费精品| 国产精品资源网| 国产精品伦理一区| 日韩av在线播放网址| 国产又粗又猛又爽| 天天色天天草天天射| 午夜激情视频在线观看| 97影视大全免费追剧大全在线观看| 成人午夜av影视| 国产一区二区三区中文字幕| 精品剧情v国产在线观看在线| 亚洲精品一区视频| 一道本在线观看视频| 成年人福利网站| 欧洲精品久久一区二区| 尤物网址在线观看| 免费三级毛片| 亚洲最大在线| 另类高清dbsm日本tvav| 日本精品在线| 九九热免费视频| 精品一区二区三区四区五区六区| 色999五月色| 伊人久久成人| 丁香资源影视免费观看| 麻豆一二三区精品蜜桃| 欧亚精品在线观看| 国产视频一区在线观看一区免费| 国产精品色噜噜| 亚洲色图综合久久| 综合久久五月天| 久久精品国产久精国产思思| 美女福利视频一区二区| 理论片日本一区| 成年人在线看片| 66视频精品| www.日日操| 日本成人在线网站| 亚洲国产成人私人影院| 亚洲国产一区自拍| 亚洲天堂国产精品| 成人午夜剧场视频网站| 欧美一级二级三级视频| 老汉色影院首页| 91麻豆福利精品推荐| 精品无人区卡一卡二卡三乱码免费卡| 国产欧美一区二区三区在线看蜜臂| 一二三四社区在线视频6| 97精品国产露脸对白| 国内精品久久久久久久久电影网| 亚洲综合国产精品| 无套内谢的新婚少妇国语播放| 亚洲电影激情视频网站| 无限国产资源| 高h视频在线播放| 日韩成人午夜影院| 蜜桃视频一区| 国产成人精品亚洲日本在线观看| 日韩精品一区二区三区四区视频| 国产专区视频| 日韩漫画puputoon| 国产高清精品网站| 97中文字幕在线| 西西人体一区二区| 国产一区二区精品久久91| 国产黄色一区| 午夜日韩av| 久久国产精品久久久久久电车| 午夜久久中文| 亚洲国产精华液| 日本精品一区二区三区在线播放视频| 91免费看视频| 久久国产精品一区二区三区四区| 韩国一区二区在线播放| 亚洲精品乱码久久久久久| 欧洲亚洲在线视频| 国产成人精品免费在线| 热99re久久精品这里都是免费| 男女视频在线观看网站| 日韩精品视频免费看| 日韩欧美少妇| 尤物视频在线观看| 国产后进白嫩翘臀在线观看视频| 国产综合欧美在线看| 亚洲成人av中文| 国产情侣一区在线| 国产无遮挡又黄又爽免费软件| 在线满18网站观看视频| 青青在线视频观看| 欧美日韩国产一区精品一区| 亚洲激情综合| 97精品人妻一区二区三区在线| 中文无字幕一区二区三区| 曰本三级日本三级日本三级| 久久精品99久久久久久| 羞羞视频在线观看一区二区| 成人黄色av网| 欧美xxxx性xxxxx高清视频| 亚洲理论电影在线观看| 无码视频一区二区三区| 国产精品毛片大码女人| 成人av集中营| 91精品国产综合久久福利软件| 国产视频一区免费看| 丰满的亚洲女人毛茸茸| 国产在线精品二区| 亚洲三区在线观看无套内射| 精产国产伦理一二三区| 欧美一级高潮片| 中文字幕av一区二区三区佐山爱| 成人动漫在线观看视频| 欧美一级专区| 国产精品流白浆视频| 黄色污污在线观看| 成人在线国产精品| 亚洲欧美日本国产| 国产91精品高潮白浆喷水| 羞羞视频在线观看欧美| 精品伦精品一区二区三区视频| 国产极品模特精品一二| 伊人久久大香线蕉av一区| 一区二区三区人妻| 多男操一女视频| 国产精品剧情一区二区在线观看| 三级亚洲高清视频| 99久久久无码国产精品免费| 欧美日韩免费不卡视频一区二区三区| 19禁羞羞电影院在线观看| 亚洲视频重口味| 最近2019免费中文字幕视频三| 亚洲日本护士毛茸茸| 91一区一区三区| 成人黄色毛片| 国语对白在线视频| 国产成人高清精品| 一本色道久久88亚洲综合88| 久久精品99久久无色码中文字幕| free性护士videos欧美| 日本a在线免费观看| 美女视频免费精品| 精品国产亚洲日本| 亚洲高清视频中文字幕| 卡通欧美亚洲| 97在线观看视频免费| 在线观看国产成人| а天堂中文在线资源| 午夜视频久久久久久| 国产电影一区二区三区爱妃记| www.av精品| 国产精品久久久久久久一区探花| 久久国产精品波多野结衣av| 日韩欧美国产视频| 国产伦精品一区二区三区88av| 国产91热爆ts人妖在线| 国外成人在线播放| 亚洲国产97在线精品一区| 激情网站五月天| 久久精品网站视频| 欧美日韩伦理片| 国产精品一区二区三区免费观看| 欧美一区二区三区在线观看| 欧美激情精品久久久久| 91国内精品野花午夜精品| 91在线丨porny丨国产| 老司机精品视频导航| 3d玉蒲团在线观看| 久久精品福利视频|