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

主頁(yè) > 知識(shí)庫(kù) > canvas實(shí)現(xiàn)圖片馬賽克的示例代碼

canvas實(shí)現(xiàn)圖片馬賽克的示例代碼

熱門標(biāo)簽:鄭州電銷外呼系統(tǒng)違法嗎 中紳電銷智能機(jī)器人 濟(jì)南辦理400電話 鶴壁手機(jī)自動(dòng)外呼系統(tǒng)怎么安裝 農(nóng)村住宅地圖標(biāo)注 跟電銷機(jī)器人做同事 漳州人工外呼系統(tǒng)排名 威海營(yíng)銷外呼系統(tǒng)招商 ai電銷機(jī)器人連接網(wǎng)關(guān)

1. 原生canvas實(shí)現(xiàn)用到的API

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


復(fù)制代碼
代碼如下:

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

2)drawImage

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

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

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

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

6)lineWidth ---設(shè)置或返回當(dāng)前線條的寬度

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

ctx.fillStyle = color|gradient|pattern

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

9)globalAlpha ---設(shè)置或返回繪圖的當(dāng)前透明值

10)fill() ---填充當(dāng)前的圖像(路徑)。默認(rèn)顏色是黑色

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

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

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

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

2. fabric.js

簡(jiǎn)化canvas編寫的庫(kù),為canvas提供所缺少的對(duì)象模型

fabric.js能做的事

1)在canvas上創(chuàng)建、填充圖形(包括圖片、文字、規(guī)則圖形和復(fù)雜路徑組成圖形)

2)給圖形填充漸變顏色

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

4)設(shè)置圖形動(dòng)畫集用戶交互

5)生成JSON, SVG數(shù)據(jù)等

3.使用fabric.js實(shí)現(xiàn)用到的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)設(shè)置背景圖片 setBackgroundImage

canvas.setBackgroundImage(imgInstance)

4)renderAll() 重新繪制

5)on() 用戶交互

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

// 監(jiān)聽事件
/* 
   mouse:down :鼠標(biāo)按下時(shí)
   mouse:move :鼠標(biāo)移動(dòng)時(shí)
   mouse:up :鼠標(biāo)抬起時(shí)
   after:render :畫布重繪后
   object:selected:對(duì)象被選中
   object:moving:對(duì)象移動(dòng)
   object:rotating:對(duì)象被旋轉(zhuǎn)
   object:added:對(duì)象被加入
   object:removed對(duì)象被移除 
*/

6)getPointer()

7)setWidth()、setHeight() 設(shè)置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() 設(shè)置對(duì)象內(nèi)容

12)toDataURL(obj)

4.原生canvas實(shí)現(xiàn)代碼

<template>
<div class="container">
  <div class="operations">
    <ul>
      <li @click="mosaic">馬賽克</li>
      <li @click="addText">添加文字</li>
      <li @click="tailor">裁剪</li>
      <li @click="rotate">旋轉(zhuǎn)</li>
      <li @click="exportImg">導(dǎo)出圖片</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}, $)`, 2, `rgb(${r}, ${g}, $)`)
      },
      // 添加文字
      addText () {
        this.resetClickStatus()
        this.isText = true
        console.log('添加文字')
      },
      // 裁剪
      tailor () {
        this.resetClickStatus()
        this.isTailor = true
        console.log('裁剪')
      } ,
      // 旋轉(zhuǎn)
      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)  // 清理畫布內(nèi)容
        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>

效果圖如下:

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

標(biāo)簽:紅河 甘南 萍鄉(xiāng) 營(yíng)口 咸陽(yáng) 蘇州 文山 惠州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《canvas實(shí)現(xiàn)圖片馬賽克的示例代碼》,本文關(guān)鍵詞  canvas,實(shí)現(xiàn),圖片,馬賽克,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《canvas實(shí)現(xiàn)圖片馬賽克的示例代碼》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于canvas實(shí)現(xiàn)圖片馬賽克的示例代碼的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    少妇高潮爽到全身痉挛抽搐| 午夜羞羞视频| 四虎影视最新网址| 91精品国产高潮对白| 国产无遮挡裸体免费久久| 欧美日韩在线观看一区二区三区| 国产激情一区二区三区四区| 欧美激情第二页| 色播五月激情综合网| 日本综合视频| 亚洲精品视频免费| 久久精品夜色噜噜亚洲aⅴ| 国产精品九九九九| 黄网页免费在线观看| av免费看网址| 欧美亚洲动漫精品| 国产精品三级在线观看无码| 国产三级香港三韩国三级| 日韩一区精品视频| 九色蝌蚪在线视频| 人妻互换免费中文字幕| 欧美熟妇另类久久久久久不卡| 久久野战av| 中文字幕黄色网址| 久久午夜免费电影| 欧美日韩一区二区三区在线免费观看| 91精品国产综合久久精品图片| 一级久久久久久| 特黄aaaaaaaaa真人毛片| 日韩视频在线一区二区三区| 欧美精品在线视频观看| 亚洲欧洲中文| 女人公敌韩国| 免费久久网站| 黄色片免费观看视频| 国产日韩欧美精品一区| 青青青在线播放| 欧美日韩免费电影| 亚洲综合精品视频| jizz久久久久久| 一二区成人影院电影网| 成人a在线观看高清电影| 最新亚洲人成网站在线观看| 国产精品1000| 精品一区二区国语对白| 中文字幕人成一区| 欧美极品美女电影一区| 999久久久精品一区二区| 一区av在线播放| 国产精品一区免费观看| 久久久一区二区三区捆绑**| 99免费视频| avhd101老司机| 东方伊人免费在线观看| 日韩精品久久久久久久酒店| **亚洲第一综合导航网站| 91福利在线视频| 九七影院97影院理论片免费| 91成人网在线| 美女久久一区| 精品国产一二| 1769在线观看| 99国产精品久久一区二区三区| 日本蜜桃在线观看视频| 麻豆一区区三区四区产品精品蜜桃| 国产色a在线观看| caoporm免费视频在线| 蜜臀久久精品| 久草福利资源在线视频| www 成人av com| 五月婷婷欧美激情| av第一福利在线导航| 男人本色网站| yw3121.龙物视频永不失联| 91网站免费看| 色综合久久久久综合体桃花网| 里番在线播放| 日韩一区二区欧美| 亚洲成熟少妇视频在线观看| 一级做a爰片毛片| 小说区乱图片区| 亚洲精品一区二区在线播放∴| 国产日韩电影| 日本一道高清亚洲日美韩| 免费观看又污又黄在线观看国产| 免费日韩一区二区| 亚洲国产精品女人久久久| 中文字幕不卡免费视频| 97成人超碰免| 亚洲丝袜啪啪| 精品一区二区三区日本| 日韩三级一区二区| 亚洲精品电影久久久| 精品动漫一区二区三区在线观看| 国产日韩欧美视频在线| 久久久人成影片一区二区三区在哪下载| 一区二区成人免费视频| 久久久久9999| 999成人精品视频线3| 久久无码专区国产精品s| 日韩av福利在线观看| 秋霞午夜理伦电影在线观看| 一本大道久久a久久综合| 亚洲成人动漫在线播放| 蜜乳av一区二区三区| 手机福利小视频在线播放| 国产男女猛烈无遮挡| 日本中文字幕亚洲| 欧美大尺度做爰床戏| 欧美成人午夜激情视频| 免费的av在线| 国产精品二区在线观看| 欧美精品国产白浆久久久久| 色欲av伊人久久大香线蕉影院| 免费在线午夜视频| 精品国产一区二区三区免费| 在线看的av网站| 91手机在线观看| 欧美成人精品一区二区综合免费| 日韩视频一区二区三区四区| 日韩黄在线观看| 精品欧美激情在线观看| 亚洲精品自产拍在线观看| 国产成人无码专区| 神马午夜一区二区| 97免费中文视频在线观看| 免费v片在线观看| 日韩在线免费高清视频| 免费在线观看不卡| 一区二区三区视频在线观看免费| 欧美性大战xxxxx久久久| 国产乱人伦精品一区二区在线观看| 欧美极品欧美精品欧美视频| 日韩啊v在线| 精品一区二区免费看| 久久精品一区二区三区资源网| 色就是色亚洲色图| 极品白嫩少妇无套内谢| 丰满人妻一区二区三区大胸| 国产精品视频大全| 老熟妻内射精品一区| 性史性dvd影片农村毛片| 久久久久久无码精品人妻一区二区| 亚洲一区二区三区四区五区午夜| 人人澡人一摸人人添| 麻豆视频在线| 国产二级片在线观看| 天堂а√在线中文在线新版| 日韩中文字幕网站| www色aa色aawww| 高清视频在线www色| 很黄很a的视频| 欧美成人午夜免费视在线看片| av丝袜在线| 亚洲综合婷婷久久| 宅男在线精品国产免费观看| 北条麻妃一区二区三区在线观看| 亚洲美女久久精品| 亚洲激情影院| 水蜜桃在线免费观看| 无码av中文一区二区三区桃花岛| 亚洲激情五月婷婷| 日韩欧美亚洲一二三区| 久久aⅴ国产紧身牛仔裤| 欧美一级高清免费| 天天操夜夜操视频| www.88av| 亚洲二区中文字幕| 久久久久久99精品| 亚洲成人精品av| 欧美x0x0| 五月久久久综合一区二区小说| 国产精品一区二区av白丝下载| 国产破处视频在线观看| 无码aⅴ精品一区二区三区| 国产肉体ⅹxxx137大胆| 成人在线视频首页| 美女福利视频导航| www.丝袜精品| 欧美日韩成人一区二区三区| 欧美色欧美亚洲另类二区精品| 欧美日韩一区二区三区高清| 97精品久久人人爽人人爽| 3d动漫精品啪啪1区2区免费| 日韩精品成人免费观看视频| 国产丝袜精品视频| 蜜臀av无码一区二区三区| 欧美一区二区高清在线观看| 蜜桃视频污在线观看| 欧美在线观看不卡| 永久看片925tv| 国产黄在线看| av先锋影音资源站| 成人性生交大片免费看网站| 欧美wwwwww| 国产又粗又猛又黄又爽无遮挡| 精品亚洲自拍| 国产精品9999久久久久仙踪林| 国产成人久久精品77777综合| 在线播放亚洲| 欧美成人免费在线观看视频| 久久久久北条麻妃免费看| 国产欧美一区二区精品性色| 亚洲中文无码av在线| 国产午夜精品在线观看| 国产精品无码午夜福利| 91禁外国网站| 九九热这里有精品视频| 国产精品一在线观看| av中字幕久久| av综合在线观看| 欧美一级欧美三级在线观看| 日韩和欧美一区二区三区| 欧美成人一区二区三区高清| 日韩午夜在线观看| 欧美videos粗暴高清性| 曰本女人与公拘交酡| 18黄暴禁片在线观看| 97成人超碰免| 亚洲国产成人影院播放| 日韩毛片网站| 99国产精品99| 日本天堂网在线观看| 美日韩精品免费视频| 亚洲在线网站| 国产亚洲欧美视频| 亚洲福利视频导航| 国产精品99精品一区二区三区∴| 免费精品国产| 欧美亚洲另类在线一区二区三区| 日本大片在线看黄a∨免费| 中文字幕欧美日韩va免费视频| 无码日韩精品一区二区免费| 色婷婷久久av| jizzjizzjizz亚洲| ,一级淫片a看免费| 色网站国产精品| 亚洲一区在线不卡| 免费av网站在线观看| 国产h色视频在线观看| 激情综合网av| 日本а中文在线天堂| 色综合亚洲欧洲| 人人在线97| 99热99这里只有精品| 老色鬼在线视频| av在线播放免费| 国产一区二区久久| 夜夜爽妓女8888视频免费观看| 日韩精品中午字幕| 国产视频青青| 外国电影一区二区| 久久久久久久久久久久久久av| 日本在线播放一区二区| 91久久国产综合久久91精品网站| 欧美黑人孕妇孕交| 日本在线观看一区二区三区| 久久精品国产一区二区三区免费看| 先锋资源在线视频| 精品中文字幕一区二区三区四区| 在线观看视频二区| 日本中文字幕一区| 亚洲精品合集| 黄色污网站在线观看| 在线观看中文字幕亚洲| 国产一级电影网| 交换国产精品视频一区| 亚洲一区在线电影| 成av人片在线观看www| 国产精品偷乱一区二区三区| 国产成人精品av在线| av在线日韩国产精品| 搞黄视频在线观看| 欧美2区3区4区| 成人久久18免费网站麻豆| 中文字幕在线观看网站| 伊人久久久久久久久久久久| 九九热免费精品视频| 久久精品国产sm调教网站演员| 亚洲视频久久久| 另类少妇人与禽zozz0性伦| 欧美久久久久久久久久久| 欧美大片日本大片免费观看| 三上悠亚免费在线观看| 国产三级第一页| 五月精品在线| 国产欧美日韩亚洲| 欧美一区二区三区婷婷月色| 人妻精油按摩bd高清中文字幕| 一区二区三区免费在线观看视频| 亚洲成人午夜电影| 成人做爽爽免费视频| 3344国产永久在线观看视频| 我不卡伦不卡影院| 亚洲AV无码精品色毛片浪潮| 国产 欧美 精品| 天堂av在线8| 欧美国产专区| 国产精品青草综合久久久久99| 久久婷婷一区二区三区| 精品无码久久久久久久动漫| 中文字幕乱码无码人妻系列蜜桃| 中文字幕中文字幕在线一区| 中文字幕一区二区三| 久久人人爽人人爽人人片av不| 996这里只有精品| 午夜精品福利一区二区三区蜜桃| 手机看片日韩国产| 日韩在线理论| 成人c视频免费高清在线观看| 成人18夜夜网深夜福利网| 欧美日韩在线免费播放| 午夜免费福利在线| 日韩电影二区| 麻豆精品国产传媒mv男同| 欧美 亚洲 另类 激情 另类| 国产系列第一页| 成人精品亚洲| 亚洲精品视频在线免费| 在线精品一区| 精品一区二区成人精品| 日韩在线免费看| 91麻豆精品国产自产在线观看一区| 成人好色电影| 日韩激情小视频| 国产美女福利视频| 青青在线视频观看| 免费观看欧美成人禁片|