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

主頁 > 知識庫 > canvas實現圖片馬賽克的示例代碼

canvas實現圖片馬賽克的示例代碼

熱門標簽:鄭州電銷外呼系統違法嗎 中紳電銷智能機器人 濟南辦理400電話 鶴壁手機自動外呼系統怎么安裝 農村住宅地圖標注 跟電銷機器人做同事 漳州人工外呼系統排名 威海營銷外呼系統招商 ai電銷機器人連接網關

1. 原生canvas實現用到的API

1) getContext(contextID) ---返回一個用于在畫布上繪圖的環境


復制代碼
代碼如下:

Canvas.getContext('2d') // 返回一個 CanvasRenderingContext2D 對象,使用它可以繪制到 Canvas 元素中

2)drawImage

drawImage(imgObj, x, y)  // 按原圖大小繪制, x、y為圖片在畫布中的位置坐標
drawImage(imgObj, x, y, width, height) // 按指定寬高繪制
drawImage(imgObj, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight) // 從原來圖片上某一個位置開始(sourceX,sourceY),指定長寬進行剪切(sourceWidth,sourceHeight),然后將剪切的內容放到位置為(destX,destY),寬度為(destWidth),高度為(destHeight)的位置上

3) getImageData(x, y, width, height) ---獲取矩形區域的圖像信息

ctx.getImageData(0, 0, 10, 10) // 獲取左上角坐標為(0, 0),寬高為區域內的圖像信息
// 返回ImageData: { width: 10, height: 10, data: Uint8ClampedArray[400] }

4)beginPath() ---開始一條路徑,或重置當前的路徑 5)rect(x, y, width, height) ---繪制矩形

6)lineWidth ---設置或返回當前線條的寬度

7)fillStyle ---設置或返回用于填充繪畫的顏色、漸變或模式

ctx.fillStyle = color|gradient|pattern

8)strokeStyle ---設置或返回用于筆觸的顏色、漸變或模式

9)globalAlpha ---設置或返回繪圖的當前透明值

10)fill() ---填充當前的圖像(路徑)。默認顏色是黑色

【注】如果路徑未關閉,那么 fill() 方法會從路徑結束點到開始點之間添加一條線,以關閉該路徑,然后填充該路徑。

11)stroke() ---會實際地繪制出通過 moveTo() 和 lineTo() 方法定義的路徑。默認顏色是黑色

12)toDataURL(type, encoderOptions) ---導出圖片,type為圖片類型, encoderOptions圖片質量,[0, 1]

Canvas.toDataURL("image/png", 1)

2. fabric.js

簡化canvas編寫的庫,為canvas提供所缺少的對象模型

fabric.js能做的事

1)在canvas上創建、填充圖形(包括圖片、文字、規則圖形和復雜路徑組成圖形)

2)給圖形填充漸變顏色

3)組合圖形(包括組合圖形、圖形文字、圖片等)

4)設置圖形動畫集用戶交互

5)生成JSON, SVG數據等

3.使用fabric.js實現用到的API

1)聲明畫布

let canvas =new fabric.Canvas('canvas') {
   width: 200,
   height: 200
}

插入圖片

let imgInstance = new fabric.Image(imgElement,{
  left: 0,
  top: 0,
  width: 100,
  height: 100,
  angle: 0
}

3)設置背景圖片 setBackgroundImage

canvas.setBackgroundImage(imgInstance)

4)renderAll() 重新繪制

5)on() 用戶交互

canvas.on('mouse:down', function(options) {  
   console.log(options.e.clientX, options.e.clientY)  
})

// 監聽事件
/* 
   mouse:down :鼠標按下時
   mouse:move :鼠標移動時
   mouse:up :鼠標抬起時
   after:render :畫布重繪后
   object:selected:對象被選中
   object:moving:對象移動
   object:rotating:對象被旋轉
   object:added:對象被加入
   object:removed對象被移除 
*/

6)getPointer()

7)setWidth()、setHeight() 設置canvas的寬高

8)畫矩形

let rect = new fabric.Rect({
 left: 0,
 top: 0,
 width: 100,
 height: 100
})

add(obj) 添加圖形

canvas.add(rect)

10)remove(obj) 移除圖形

11)set() 設置對象內容

12)toDataURL(obj)

4.原生canvas實現代碼

<template>
<div class="container">
  <div class="operations">
    <ul>
      <li @click="mosaic">馬賽克</li>
      <li @click="addText">添加文字</li>
      <li @click="tailor">裁剪</li>
      <li @click="rotate">旋轉</li>
      <li @click="exportImg">導出圖片</li>
    </ul>
  </div>
  <canvas ref="imgContent" class="img-wrap">
    你的瀏覽器太low🌶
  </canvas>
</div>
</template>

<script>
  export default {
    data () {
      return {
        context: '',
        canvas: '',
        isMasic: false,
        isText: false,
        isTailor: false,
        isTranslate: false,
        squareEdgeLength: 20,
        angle: 0,
        img: ''
      }
    },
    mounted () {
      this.initData()
    },
    methods: {
      initData () {
        let imgContent = this.$refs.imgContent
        this.canvas = imgContent
        this.context = imgContent.getContext('2d')
        let  Img = new Image()
        this.image = Img
        Img.crossOrigin = "Anonymous"
        Img.src = 'http://oia85104s.bkt.clouddn.com/PictureUnlock_193139.pictureunlock.jpg'
        this.canvas.setAttribute('width', Img.width)
        this.canvas.setAttribute('height', Img.height)
        let self = this
        Img.onload = () => {
          let beginX, beginY, endX, endY
          self.context.drawImage(Img, 0, 0)
          self.context.save()

          self.canvas.addEventListener('mousedown', e => {
            beginX = e.offsetX
            beginY = e.offsetY
            self.canvas.addEventListener('mouseup', e => {
              endX = e.offsetX
              endY = e.offsetY
              if (self.isMasic) {
                self.makeGrid(beginX, beginY, endX - beginX, endY - beginY)
                return
              }
              if (self.isTailor) {
                self.context.drawImage(Img, beginX, beginY, endX - beginX, endY - beginY, 0, 0, endX - beginX, endY - beginY)
                return
              }
            })
          })
        }
      },
      drawRect  (x, y, width, height, fillStyle, lineWidth, strokeStyle, globalAlpha) {
        this.context.beginPath()
        this.context.rect(x, y, width, height)
        this.context.lineWidth = lineWidth
        this.context.strokeStyle = strokeStyle
        fillStyle && (this.context.fillStyle = fillStyle)
        globalAlpha && (this.context.globalAlpha = globalAlpha)

        this.context.fill()
        this.context.stroke()
      },
      // 打馬賽克
      mosaic () {
        let self = this
        this.resetClickStatus()
        this.isMasic = true
      },
      makeGrid (beginX, beginY, rectWidth, rectHight) {
        const row = Math.round(rectWidth / this.squareEdgeLength) + 1
        const column = Math.round(rectHight / this.squareEdgeLength) + 1
        for (let i = 0; i < row * column; i++) {
          let x = (i % row) * this.squareEdgeLength + beginX
          let y = parseInt(i / row) * this.squareEdgeLength + beginY
          this.setColor(x, y)
        }
      },
      setColor (x, y) {
        const imgData = this.context.getImageData(x, y, this.squareEdgeLength, this.squareEdgeLength).data
        let r = 0, g = 0, b = 0
        console.log(this.context.getImageData(x, y, this.squareEdgeLength, this.squareEdgeLength), JSON.stringify(imgData))
        for (let i = 0; i < imgData.length; i += 4) {
          r += imgData[i]
          g += imgData[i + 1]
          b += imgData[i + 2]
        }
        r = Math.round(r / (imgData.length / 4))
        g = Math.round(g / (imgData.length / 4))
        b = Math.round(b / (imgData.length / 4))
        this.drawRect(x, y, this.squareEdgeLength, this.squareEdgeLength, `rgb(${r}, ${g}, ${b})`, 2, `rgb(${r}, ${g}, ${b})`)
      },
      // 添加文字
      addText () {
        this.resetClickStatus()
        this.isText = true
        console.log('添加文字')
      },
      // 裁剪
      tailor () {
        this.resetClickStatus()
        this.isTailor = true
        console.log('裁剪')
      } ,
      // 旋轉
      rotate () {
        // if (this.angle === 360) {
        //   this.angle = 90
        // } else {
        //   this.angle += 90
        // }
        // if ([90, 270].includes(this.angle)) {
        //   this.canvas.setAttribute('width', this.image.height)
        //   this.canvas.setAttribute('height', this.image.width)
        // } else {
        //   this.canvas.setAttribute('width', this.image.width)
        //   this.canvas.setAttribute('height', this.image.height)
        // }
        const x = this.image.width / 2
        const y = this.image.height / 2
        this.context.clearRect(0,0, this.canvas.width, this.canvas.height)  // 清理畫布內容
        this.context.translate(x, y)
        this.context.rotate(90 * Math.PI / 180)
        this.context.translate(-x, -y)
        this.context.drawImage(this.image, 0, 0)
      },
      resetClickStatus () {
        this.isMasic = false
        this.isText = false
        this.isTailor = false
        this.isTranslate = false
      },
      exportImg () {
        this.resetClickStatus()
        const exportUrl = this.canvas.toDataURL("image/jpeg")
        let a = document.createElement('a')
        a.setAttribute('download', '')
        a.href = exportUrl
        document.body.appendChild(a)
        a.click()
      }
    }
  }
</script>

<style scoped lang="less">
.operations {
  width: 1200px;
  margin: 0 auto;
  ul {
    display: flex;
    align-items: center;
    margin-bottom: 30px;
    li {
      list-style: none;
      margin-right: 20px;
      cursor: pointer;
    }
  }
}
.img-wrap {
  display: block;
  margin: 0 auto;
}
</style>

效果圖如下:

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

標簽:紅河 甘南 萍鄉 營口 咸陽 蘇州 文山 惠州

巨人網絡通訊聲明:本文標題《canvas實現圖片馬賽克的示例代碼》,本文關鍵詞  canvas,實現,圖片,馬賽克,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《canvas實現圖片馬賽克的示例代碼》相關的同類信息!
  • 本頁收集關于canvas實現圖片馬賽克的示例代碼的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日本女人一区二区三区| 成人欧美一区二区三区黑人麻豆| 欧美日韩亚洲综合在线 | 欧美日韩aaaaaa| 国产精品麻豆99久久久久久| 成人国产亚洲欧美成人综合网| 91久久精品一区二区三| 国产成人午夜精品影院观看视频 | 麻豆一区二区三| 激情欧美日韩一区二区| 国产高清在线观看免费不卡| 91蜜桃在线观看| 日韩欧美国产麻豆| 天天色天天操综合| 欧美无砖专区一中文字| 精品免费日韩av| 午夜精品一区二区三区免费视频| 老司机精品视频导航| 欧美久久久久久蜜桃| 亚洲美女屁股眼交| 韩国精品免费视频| 国产一区二区三区美女| 91小视频在线免费看| 欧美一二三区精品| 国产精品久久久久久久久久免费看 | av在线不卡观看免费观看| 亚洲一区二区精品视频| 国产午夜精品一区二区三区四区| 欧美一区二区三区公司| 欧美中文字幕不卡| 成人sese在线| 波多野结衣在线一区| 久久亚洲欧美国产精品乐播| 久久91精品久久久久久秒播| 欧美电视剧免费观看| 日本亚洲欧美天堂免费| 777奇米成人网| 日韩av电影免费观看高清完整版在线观看| 成人午夜免费视频| 亚洲天堂2016| 在线电影一区二区三区| 中文字幕视频一区| 91捆绑美女网站| 午夜精品久久久久久久久| 欧美日韩一区二区在线观看| 精品一区二区三区在线播放| 国产精品福利影院| 欧美人伦禁忌dvd放荡欲情| 日韩黄色片在线观看| 成人欧美一区二区三区白人 | 国产在线精品一区二区三区不卡| 国产精品蜜臀在线观看| 久久伊人中文字幕| 欧美三级视频在线播放| 亚洲一区日韩精品中文字幕| 色域天天综合网| 亚洲电影视频在线| 亚洲婷婷国产精品电影人久久| 国产丝袜美腿一区二区三区| 亚洲免费观看在线视频| 欧美不卡视频一区| 2017欧美狠狠色| 久久这里只有精品首页| 精品黑人一区二区三区久久| 欧美剧情电影在线观看完整版免费励志电影 | 日韩不卡一二三区| 亚洲欧洲成人精品av97| 日韩一区二区在线观看| 欧美三级电影在线看| 激情综合色播激情啊| 亚洲精品午夜久久久| 中文在线免费一区三区高中清不卡| 欧美中文字幕一区二区三区| 一本大道综合伊人精品热热| 高清不卡一区二区| 国产精品1区二区.| www.亚洲在线| 99久久综合国产精品| 国产福利一区在线观看| 国产91精品一区二区| 成人动漫视频在线| 99免费精品在线观看| 99久久精品免费| 色婷婷精品久久二区二区蜜臂av | 国产精品福利影院| 中文字幕一区二区三区不卡在线| 国产精品久久久久三级| 91精品国产综合久久婷婷香蕉| 国产一区二区剧情av在线| 亚洲va中文字幕| 91精品福利视频| 日韩激情一二三区| 91麻豆国产香蕉久久精品| 欧美三级电影在线看| 日韩欧美中文字幕公布| 亚洲同性同志一二三专区| 久久久综合视频| 亚洲精选一二三| 狠狠色丁香婷综合久久| 国产91丝袜在线播放0| 91视频国产观看| 久久精品国产999大香线蕉| 久久69国产一区二区蜜臀| 精品一区二区三区免费毛片爱| 蜜臀av一区二区在线观看| 国产成人av电影| 国产精一品亚洲二区在线视频| 成人av网站免费| 色美美综合视频| 国产精品久久久久影视| 国产精品久久久久9999吃药| 一区二区三区欧美在线观看| 久久精品免费看| 日本一区免费视频| 午夜精品国产更新| 成人自拍视频在线观看| 日韩精品中文字幕在线不卡尤物| 亚洲精品一二三| 国产成人综合在线| 久久亚洲综合色一区二区三区| 亚洲国产日韩综合久久精品| 成人免费毛片app| 欧美日韩二区三区| 亚洲大片一区二区三区| 国产在线国偷精品免费看| 亚洲精品在线观| 国产自产高清不卡| 制服丝袜av成人在线看| 久久99精品久久久久久国产越南 | 91丨九色丨蝌蚪丨老版| 色婷婷久久久综合中文字幕| 国产精品家庭影院| www.欧美日韩国产在线| 日韩成人午夜电影| 免费成人你懂的| 韩国av一区二区三区四区| 视频一区二区欧美| 欧美蜜桃一区二区三区 | 亚洲欧洲综合另类在线 | 欧美视频一区二区三区在线观看 | 国产人成亚洲第一网站在线播放| 久久久亚洲精品一区二区三区| 蜜臀av性久久久久蜜臀aⅴ | 国产精品乱人伦中文| 国产制服丝袜一区| 99热99精品| 日韩av中文字幕一区二区三区| 欧美美女喷水视频| 日本欧洲一区二区| 国产精品久久久99| 色婷婷av一区二区三区大白胸 | 亚洲一区在线观看免费| 欧美精品久久久久久久久老牛影院| 免费在线观看视频一区| 久久久久久久久久久久久女国产乱 | 奇米精品一区二区三区在线观看 | 欧美亚洲综合色| 视频一区二区中文字幕| 欧美精品高清视频| 国产精品亚洲视频| 国产精品综合av一区二区国产馆| 99麻豆久久久国产精品免费优播| 国产无人区一区二区三区| 午夜久久久影院| 久久久精品中文字幕麻豆发布| 日本视频在线一区| 国产精品乱码人人做人人爱| 国产一区在线视频| 亚洲综合成人在线视频| 日韩亚洲欧美一区| 岛国一区二区三区| 日日噜噜夜夜狠狠视频欧美人| 日韩视频免费观看高清完整版在线观看| 国产99一区视频免费| 亚洲黄色免费网站| 六月丁香婷婷色狠狠久久| 亚洲午夜影视影院在线观看| 亚洲精选视频在线| 亚洲四区在线观看| 亚洲精品一区二区三区蜜桃下载 | 久久久精品一品道一区| 激情综合网最新| 久久不见久久见免费视频1| 五月天网站亚洲| 蜜桃传媒麻豆第一区在线观看| 欧美电影免费观看高清完整版在 | 欧美人xxxx| 欧美视频在线不卡| 日韩久久久精品| 亚洲精品一区二区三区香蕉| 久久亚洲影视婷婷| ww久久中文字幕| 一区二区中文视频| 青青草原综合久久大伊人精品| 午夜视黄欧洲亚洲| 蜜桃视频一区二区三区在线观看 | 精品理论电影在线观看 | 欧美在线短视频| 色婷婷综合视频在线观看| 制服丝袜成人动漫|