婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

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

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

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

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

預覽地址
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
}

源碼

復制到html文件可預覽

<!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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

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

巨人網(wǎng)絡通訊聲明:本文標題《使用canvas一步步實現(xiàn)圖片打碼功能的方法》,本文關鍵詞  使用,canvas,一,步步,實現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用canvas一步步實現(xiàn)圖片打碼功能的方法》相關的同類信息!
  • 本頁收集關于使用canvas一步步實現(xiàn)圖片打碼功能的方法的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美日本免费一区二区三区| 高清不卡在线观看| 亚洲欧美日韩成人高清在线一区| 精品国产乱码久久久久久老虎| 欧美精品 日韩| 777久久久精品| 日韩一二三四区| 精品国产露脸精彩对白 | 99国产精品国产精品久久| 国产成人欧美日韩在线电影| 国产精品888| 北岛玲一区二区三区四区| 91在线免费播放| 在线观看一区日韩| 91精品国产色综合久久| 久久久亚洲综合| 国产精品国产自产拍高清av王其| 中文字幕一区二区三区精华液| 亚洲色图丝袜美腿| 日韩精品电影一区亚洲| 精品一区二区三区日韩| www.色综合.com| 欧美区视频在线观看| 久久久www成人免费毛片麻豆| 国产精品伦一区| 午夜欧美大尺度福利影院在线看| 久久精品久久久精品美女| 懂色中文一区二区在线播放| 91国偷自产一区二区三区成为亚洲经典 | 亚洲免费三区一区二区| 偷拍亚洲欧洲综合| 国产精品一二三| 91九色最新地址| 久久久亚洲精品一区二区三区| 亚洲欧美日韩小说| 久久国产精品99久久人人澡| 91麻豆国产在线观看| 精品三级av在线| 亚洲一区二区免费视频| 国产乱码精品1区2区3区| 色综合久久九月婷婷色综合| 欧美成人三级电影在线| 亚洲女同一区二区| 国产一区二区三区av电影| 欧美在线观看视频一区二区三区| 久久久综合精品| 亚洲国产综合色| youjizz国产精品| 欧美xfplay| 午夜精品福利视频网站| av一区二区三区在线| 日韩精品一区国产麻豆| 玉足女爽爽91| 91丝袜国产在线播放| 国产亚洲综合色| 久久精品国产一区二区三| 91久久人澡人人添人人爽欧美| 国产片一区二区三区| 精品系列免费在线观看| 日韩一区二区免费视频| 亚洲bt欧美bt精品777| 99国产精品99久久久久久| 国产亚洲欧美一区在线观看| 男男成人高潮片免费网站| 欧美日韩一二三| 午夜在线成人av| 欧美少妇一区二区| 亚洲精品久久久蜜桃| 99久久久国产精品| 国产精品国产a级| 91美女片黄在线观看91美女| 中文文精品字幕一区二区| 国产精品综合二区| 国产午夜久久久久| 成人精品视频一区二区三区尤物| 国产亚洲精品精华液| 国产成人免费av在线| 国产日韩欧美精品在线| 成人网在线免费视频| 中文字幕一区二区三区四区| 色噜噜狠狠色综合中国| 亚洲高清视频在线| 欧美一级欧美三级| 麻豆国产精品视频| 久久新电视剧免费观看| 成人动漫中文字幕| 一区二区三区欧美在线观看| 欧美日韩电影一区| 九一久久久久久| 国产欧美日韩综合精品一区二区| 成人免费毛片app| 亚洲男人的天堂一区二区| 欧美日韩国产色站一区二区三区| 热久久久久久久| 国产亚洲短视频| 色噜噜久久综合| 免费在线观看一区| 国产精品全国免费观看高清| 欧美日韩一区视频| 国产一区二区中文字幕| 亚洲日本va午夜在线影院| 欧美美女直播网站| 国产精品亚洲第一区在线暖暖韩国| 国产精品国产自产拍高清av| 欧美视频精品在线观看| 国产精品一区二区男女羞羞无遮挡| 国产精品久线观看视频| 欧美男生操女生| 不卡视频一二三四| 蜜臀av亚洲一区中文字幕| 国产精品人成在线观看免费 | 久久亚洲综合色一区二区三区| 成人丝袜18视频在线观看| 久久99国产精品久久99果冻传媒 | 99久久久精品| 久久国产精品99久久人人澡| 亚洲免费观看高清完整版在线观看 | 成人黄色av网站在线| 午夜精品久久久久久久99水蜜桃| 久久久99久久| 日韩一级精品视频在线观看| 91麻豆免费在线观看| 国产精品白丝jk黑袜喷水| 午夜精品福利久久久| 亚洲欧美一区二区久久| 精品国产不卡一区二区三区| 欧美日韩国产色站一区二区三区| 波多野结衣中文字幕一区 | 日本一区二区动态图| 欧美一级精品在线| 欧美日韩一区二区在线视频| 成人av免费在线观看| 国内精品免费在线观看| 日日摸夜夜添夜夜添精品视频 | 激情综合色综合久久| 午夜精品爽啪视频| 亚洲国产精品久久人人爱| 国产成人在线视频播放| 精品一区二区精品| 麻豆精品视频在线观看视频| 亚洲成人免费av| 亚洲电影一级黄| 亚洲mv在线观看| 日韩黄色免费电影| 日本美女一区二区三区| 五月天亚洲婷婷| 奇米影视7777精品一区二区| 视频一区欧美日韩| 日韩精品亚洲一区二区三区免费| 亚洲成人1区2区| 免费视频一区二区| 麻豆91在线观看| 激情五月婷婷综合网| 国产一二精品视频| 丰满放荡岳乱妇91ww| 不卡的av在线播放| 在线看日韩精品电影| 欧美日韩黄色一区二区| 欧美巨大另类极品videosbest| 7777精品伊人久久久大香线蕉的| 欧美一区二区精品| www久久精品| 国产精品电影院| 一区二区三区四区不卡在线| 亚洲一二三区不卡| 日本不卡视频一二三区| 国产美女精品在线| 99久久亚洲一区二区三区青草| 在线观看日韩av先锋影音电影院| 欧美性做爰猛烈叫床潮| 7777女厕盗摄久久久| 26uuu另类欧美亚洲曰本| 国产精品福利av| 亚洲综合999| 国产乱一区二区| 欧美性videosxxxxx| 欧美精品一区二区三区久久久| 国产精品美女久久福利网站| 亚洲国产视频一区| 国产一区二区福利| 欧美性淫爽ww久久久久无| 欧美v国产在线一区二区三区| 日本一区二区免费在线| 亚洲成人第一页| 国产成人一区在线| 欧美日韩久久一区| 欧美激情一二三区| 秋霞影院一区二区| 91在线免费看| 久久精品欧美一区二区三区麻豆| 亚洲国产精品综合小说图片区| 黑人巨大精品欧美黑白配亚洲| 成人免费视频caoporn| 欧美一区二区三区免费观看视频| 国产清纯白嫩初高生在线观看91| 亚洲一区二区av电影| 成人av电影观看| 久久久亚洲精品一区二区三区| 天天综合日日夜夜精品| 不卡的av电影在线观看|