真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在vue項目中實現(xiàn)一個圖片裁剪功能-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)怎么在vue項目中實現(xiàn)一個圖片裁剪功能,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)服務緊隨時代發(fā)展步伐,進行技術(shù)革新和技術(shù)進步,經(jīng)過10年的發(fā)展和積累,已經(jīng)匯集了一批資深網(wǎng)站策劃師、設(shè)計師、專業(yè)的網(wǎng)站實施團隊以及高素質(zhì)售后服務人員,并且完全形成了一套成熟的業(yè)務流程,能夠完全依照客戶要求對網(wǎng)站進行成都網(wǎng)站建設(shè)、網(wǎng)站制作、建設(shè)、維護、更新和改版,實現(xiàn)客戶網(wǎng)站對外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網(wǎng)化提供全面的解決方案。

使用cropperjs插件

安裝cropperjs

yarn install cropperjs

初始化一個canvas元素,并在上面繪制圖片

// 在canvas上繪制圖片
drawImg () {
 this.$nextTick(() => {
 // 獲取canvas節(jié)點
 let canvas = document.getElementById(this.data.src)
 if (canvas) {
 // 設(shè)置canvas的寬為canvas的父元素寬度,寬高比3:2
 let parentEle = canvas.parentElement
 canvas.width = parentEle.offsetWidth
 canvas.height = 2 * parentEle.offsetWidth / 3
 let ctx = canvas.getContext('2d')
 ctx.clearRect(0, 0, canvas.width, canvas.height)
 let img = new Image()
 img.crossOrigin = 'Anonymous'
 img.src = this.data.src
 img.onload = function () {
 ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
 }
 }
 })
}

如果遇到canvas跨域繪制圖片報錯,設(shè)置圖片img.crossOrigin = 'Anonymous',并且服務器響應頭設(shè)置Access-Control-Allow-Origin:*

創(chuàng)建cropperjs

// 引入
import Cropper from 'cropperjs'

// 顯示裁剪框
initCropper () {
 let cropper = new Cropper(this.$refs.canvas, {
 checkCrossOrigin: true,
 viewMode: 2,
 aspectRatio: 3 / 2
 })
}

更多方法和屬性,參考官網(wǎng): https://github.com/fengyuanchen/cropperjs

具體實現(xiàn),可以查看源碼的cropper.vue 或 cropper.one.vue組件:

cropper.vue組件:https://github.com/MY729/picture-crop-demo/blob/master/src/components/cropper.vue
cropper.one.vue組件:https://github.com/MY729/picture-crop-demo/blob/master/src/components/cropper.one.vue

使用canvas實現(xiàn)圖片裁剪

支持鼠標繪制裁剪框,并移動裁剪框

思路:

  • 在canvas上繪制圖片為背景

  • 監(jiān)聽鼠標點擊、移動、松開事件

canvas的isPointInPath()方法: 如果給定的點的坐標位于路徑之內(nèi)的話(包括路徑的邊),否則返回 false

具體實現(xiàn)可查看源碼cropper.canvas.vue組件: https://github.com/MY729/picture-crop-demo/blob/master/src/components/cropper.canvas.vue

cropImg () {
 let canvas = document.getElementById(this.data.img_url)
 let ctx = canvas.getContext('2d')
 let img = new Image()
 img.onload = function () {
 ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
 }
 img.src = this.data.src
 let drag = false // 是否拖動矩形
 let flag = false // 是否繪制矩形
 let rectWidth = 0 // 繪制矩形的寬
 let rectHeight = 0 // 繪制矩形的高
 let clickX = 0 // 矩形開始繪制X坐標
 let clickY = 0 // 矩形開始繪制Y坐標
 let dragX = 0 // 當要拖動矩形點擊時X坐標
 let dragY = 0 // 當要拖動矩形點擊時Y坐標
 let newRectX = 0 // 拖動變化后矩形開始繪制的X坐標
 let newRectY = 0 // 拖動變化后矩形開始繪制的Y坐標
 // 鼠標按下
 canvas.onmousedown = e => {
 // 每次點擊前如果有繪制好的矩形框,通過路徑繪制出來,用于下面的判斷
 ctx.beginPath()
 ctx.setLineDash([6, 6])
 ctx.moveTo(newRectX, newRectY)
 ctx.lineTo(newRectX + rectWidth, newRectY)
 ctx.lineTo(newRectX + rectWidth, newRectY + rectHeight)
 ctx.lineTo(newRectX, newRectY + rectHeight)
 ctx.lineTo(newRectX, newRectY)
 ctx.strokeStyle = 'green'
 ctx.stroke()
 // 每次點擊,通過判斷鼠標點擊的點在矩形框內(nèi)還是外,來決定重新繪制還是移動矩形框
 if (ctx.isPointInPath(e.offsetX, e.offsetY)) {
 drag = true
 dragX = e.offsetX
 dragY = e.offsetY
 clickX = newRectX
 clickY = newRectY
 } else {
 ctx.clearRect(0, 0, canvas.width, canvas.height)
 ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
 flag = true
 clickX = e.offsetX
 clickY = e.offsetY
 newRectX = e.offsetX
 newRectY = e.offsetY
 }
 }
 // 鼠標抬起
 canvas.onmouseup = () => {
 if (flag) {
 flag = false
 this.sureCrop(clickX, clickY, rectWidth, rectHeight)
 }
 if (drag) {
 drag = false
 this.sureCrop(newRectX, newRectY, rectWidth, rectHeight)
 }
 }
 // 鼠標移動
 canvas.onmousemove = (e) => {
 if (flag) {
 ctx.clearRect(0, 0, canvas.width, canvas.height)
 ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
 rectWidth = e.offsetX - clickX
 rectHeight = e.offsetY - clickY

 ctx.beginPath()
 ctx.strokeStyle = '#FF0000'
 ctx.strokeRect(clickX, clickY, rectWidth, rectHeight)
 ctx.closePath()
 }
 if (drag) {
 ctx.clearRect(0, 0, canvas.width, canvas.height)
 ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
 ctx.beginPath()
 newRectX = clickX + e.offsetX - dragX
 newRectY = clickY + e.offsetY - dragY
 ctx.strokeStyle = 'yellow'
 ctx.strokeRect(newRectX, newRectY, rectWidth, rectHeight)
 ctx.closePath()
 }
 }
},
// 拿到裁剪后的參數(shù),可自行處理圖片
sureCrop (x, y, width, height) {
 let canvas = document.getElementById(this.data.img_url + 'after')
 // 設(shè)置canvas的寬為canvas的父元素寬度,寬高比3:2
 let parentEle = canvas.parentElement
 canvas.width = parentEle.offsetWidth
 canvas.height = 2 * parentEle.offsetWidth / 3
 let ctx = canvas.getContext('2d')
 let img = new Image()
 img.src = this.data.src
 img.onload = function () {
 ctx.beginPath()
 ctx.moveTo(x, y)
 ctx.lineTo(x + width, y)
 ctx.lineTo(x + width, y + height)
 ctx.lineTo(x, y + height)
 ctx.clip()
 ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
 }
 ctx.stroke()
}

看完上述內(nèi)容,你們對怎么在vue項目中實現(xiàn)一個圖片裁剪功能有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


名稱欄目:怎么在vue項目中實現(xiàn)一個圖片裁剪功能-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://weahome.cn/article/djppeg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部