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

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

使用canvas一步步實現圖片打碼功能的方法

熱門標簽:智能電銷機器人被禁用了么 高德地圖標注商戶怎么標 電話機器人技術 如何查看地圖標注 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

首先創建一個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>

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

實現思路

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

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

// 初始化 繪制圖片
toCode (currentImg) {
  this.$nextTick(() => {
    // 獲取將要繪制的canvas的父元素節點
    let parentId = document.getElementById('parentId')
    // 初始化圖片
    let drawImg = new Image()
    drawImg.setAttribute('crossOrigin', 'anonymous')
    drawImg.crossOrigin = 'Anonymous'
    drawImg.src = currentImg
    // 創建canvas元素并添加到父節點中
    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)
      }
    }
  })
}

點擊打碼按鈕,繪制打碼區域

思路:

  • 鼠標點擊,獲取點擊時的坐標,每次點擊前可能會存在打過碼的區域,先清除畫布,重新繪制圖片
  • 鼠標移動,開始繪制打碼的矩形,通過移動的坐標和上面點擊的點坐標確定繪制的矩形坐標和寬高
  • 將繪制的打碼矩形,分割成一個個寬高15像素的小正方形,并給每個小正方形生產隨機顏色
  • 鼠標松開,停止繪制矩形
// 打碼
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 = [] // 二維數組,每個子數組有5個值(繪制矩形左上角的X坐標、y坐標,矩形的寬、高,生成的4位隨機數用于顏色值)
        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
}

源碼

復制到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一步步實現圖片打碼功能</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一步步實現圖片打碼功能</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>點擊打碼按鈕,在圖片上繪制打碼區域; 點擊保存,生成打碼后的圖片</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 = [] // 二維數組,每個子數組有5個值(繪制矩形左上角的X坐標、y坐標,矩形的寬、高,生成的4位隨機數用于顏色值)
            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>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

標簽:中山 阿壩 赤峰 萍鄉 金昌 盤錦 綏化 聊城

巨人網絡通訊聲明:本文標題《使用canvas一步步實現圖片打碼功能的方法》,本文關鍵詞  使用,canvas,一,步步,實現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用canvas一步步實現圖片打碼功能的方法》相關的同類信息!
  • 本頁收集關于使用canvas一步步實現圖片打碼功能的方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    成人激情视频网站| 欧美无人高清视频在线观看| 懂色av一区二区夜夜嗨| 久久综合色鬼综合色| 日韩专区欧美专区| 欧美一区日本一区韩国一区| 亚洲综合一区二区精品导航| 欧美久久久久久蜜桃| 午夜精品久久久久久久久久久| 欧美三级电影一区| 日韩黄色在线观看| 日韩午夜av一区| 国产999精品久久久久久绿帽| 国产精品你懂的在线欣赏| 一本久久综合亚洲鲁鲁五月天 | 国产日韩欧美综合在线| 国产99久久久国产精品潘金| 亚洲美腿欧美偷拍| 久久久久九九视频| 色猫猫国产区一区二在线视频| 亚洲国产aⅴ成人精品无吗| 欧美一区二区三区在线视频| 国产中文字幕一区| 亚洲欧美国产高清| 欧美色爱综合网| 国产一区二区视频在线播放| 最新国产成人在线观看| 日韩精品专区在线影院观看 | 日本韩国一区二区| 奇米色一区二区三区四区| 久久午夜电影网| 欧美在线高清视频| 国产99久久久精品| 亚洲精品欧美激情| 国产日韩欧美电影| 欧美日韩高清一区二区三区| 成人综合婷婷国产精品久久| 亚洲大片免费看| 日韩欧美精品在线| 91久久免费观看| 国产真实乱偷精品视频免| 午夜精品福利在线| 国产日韩欧美制服另类| 91精品国产综合久久小美女| 色婷婷亚洲一区二区三区| 国产精品一区一区| 性久久久久久久| 亚洲欧洲另类国产综合| 亚洲精品一区二区三区香蕉| 欧美人妖巨大在线| 一本一道综合狠狠老| proumb性欧美在线观看| 国产成人午夜高潮毛片| 美女久久久精品| 日韩国产高清在线| 日韩精品一二三四| 亚洲福利国产精品| 亚洲免费av网站| 亚洲女与黑人做爰| 蜜臀久久99精品久久久久宅男| 亚洲色图色小说| 日韩理论在线观看| 中文字幕人成不卡一区| 国产日韩精品视频一区| 精品精品国产高清一毛片一天堂| 日韩欧美精品在线视频| 精品少妇一区二区三区| 精品毛片乱码1区2区3区| 91麻豆精品国产91久久久使用方法 | 99久久99久久精品国产片果冻| 国产一区不卡在线| 国产成人在线视频免费播放| 国产99久久精品| 一本久久a久久免费精品不卡| 欧美亚洲国产一区在线观看网站| 欧美午夜精品久久久| 制服视频三区第一页精品| 日韩欧美国产wwwww| 欧美videos中文字幕| 国产亚洲综合色| 亚洲码国产岛国毛片在线| 亚洲18女电影在线观看| 捆绑变态av一区二区三区| 国产精品888| 午夜成人免费电影| 日本美女一区二区| 国产精品69毛片高清亚洲| 成人午夜碰碰视频| 欧美优质美女网站| 91精品国产美女浴室洗澡无遮挡| www欧美成人18+| 日韩毛片精品高清免费| 丝袜美腿亚洲色图| 国产一区欧美一区| 色综合久久久久综合99| 天堂av在线一区| 国产成人亚洲精品青草天美| 色婷婷精品久久二区二区蜜臀av| 色婷婷综合久久久中文字幕| 欧美三级视频在线观看| 亚洲国产高清在线| 中文字幕欧美激情| 亚洲美女淫视频| 国产精华液一区二区三区| 欧美日韩久久不卡| 中文在线资源观看网站视频免费不卡| 综合久久久久综合| 麻豆精品在线看| 成人精品免费视频| 3751色影院一区二区三区| 亚洲国产岛国毛片在线| 日韩国产精品91| 波多野结衣视频一区| 日韩三级视频中文字幕| **性色生活片久久毛片| 精品一区二区三区在线播放视频 | 国产精品人人做人人爽人人添| 一区二区欧美国产| 精品精品国产高清一毛片一天堂| 久久久久久久久一| 婷婷开心激情综合| 韩日av一区二区| 欧美亚洲国产一区在线观看网站| 国产精品女人毛片| 极品美女销魂一区二区三区免费| 国产精品乱人伦一区二区| 午夜成人免费视频| 成人性生交大合| 久久精品视频在线免费观看| 午夜日韩在线观看| 色婷婷综合激情| 国产精品国产三级国产普通话三级| 六月丁香婷婷色狠狠久久| 欧美性视频一区二区三区| 国产精品天天摸av网| 精品一区二区在线观看| 欧美一区二区三区系列电影| 亚洲18女电影在线观看| 欧美视频一区二区在线观看| 久久新电视剧免费观看| 日产精品久久久久久久性色| 欧美老肥妇做.爰bbww视频| 亚洲欧美日韩一区二区三区在线观看 | 日本一区二区三区四区| 蜜桃一区二区三区在线观看| 国产日韩av一区| 美日韩一级片在线观看| 91福利在线播放| 国产精品黄色在线观看| aaa亚洲精品| 伊人婷婷欧美激情| 欧美在线高清视频| 亚洲激情男女视频| 欧美最猛黑人xxxxx猛交| 夜夜精品视频一区二区| 在线视频国内自拍亚洲视频| 亚洲欧美另类图片小说| 91视频你懂的| 一级中文字幕一区二区| 717成人午夜免费福利电影| 偷拍与自拍一区| 欧美老年两性高潮| 久久99精品国产麻豆婷婷| 国产拍揄自揄精品视频麻豆| 91麻豆精品在线观看| 亚洲午夜激情av| 日韩精品一区二区三区四区| 国产精品一区二区免费不卡| 亚洲日本在线看| 日韩一区二区三区电影在线观看| 成人免费电影视频| 亚洲宅男天堂在线观看无病毒| 欧美一级高清片在线观看| 国产成人午夜视频| 亚洲h在线观看| 国产欧美日韩麻豆91| 色综合天天性综合| 久久精品免费观看| 亚洲欧美另类综合偷拍| 亚洲精品在线电影| 欧美日韩一区二区三区高清 | 久久先锋影音av鲁色资源网| 欧美中文字幕一区| 成人性生交大片免费看中文| 日韩中文字幕av电影| 中文字幕亚洲精品在线观看| 亚洲精品在线三区| 欧美男女性生活在线直播观看| 成人激情免费视频| 久久国产免费看| 日韩专区在线视频| 亚洲国产精品久久人人爱| 欧美国产在线观看| 911精品国产一区二区在线| 91在线观看一区二区| 精品一区二区三区免费毛片爱| 亚洲综合一区二区精品导航| 国产亚洲欧美在线| 91精品国产综合久久小美女| 精品视频1区2区3区|