中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在vue項目中實現一個圖片裁剪功能

發布時間:2021-03-11 17:07:02 來源:億速云 閱讀:185 作者:Leah 欄目:web開發

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

使用cropperjs插件

安裝cropperjs

yarn install cropperjs

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

<canvas :id="data.src" ref="canvas"></canvas>
// 在canvas上繪制圖片
drawImg () {
 this.$nextTick(() => {
 // 獲取canvas節點
 let canvas = document.getElementById(this.data.src)
 if (canvas) {
 // 設置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跨域繪制圖片報錯,設置圖片img.crossOrigin = 'Anonymous',并且服務器響應頭設置Access-Control-Allow-Origin:*

創建cropperjs

// 引入
import Cropper from 'cropperjs'

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

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

具體實現,可以查看源碼的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實現圖片裁剪

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

思路:

  • 在canvas上繪制圖片為背景

  • 監聽鼠標點擊、移動、松開事件

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

具體實現可查看源碼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()
 // 每次點擊,通過判斷鼠標點擊的點在矩形框內還是外,來決定重新繪制還是移動矩形框
 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()
 }
 }
},
// 拿到裁剪后的參數,可自行處理圖片
sureCrop (x, y, width, height) {
 let canvas = document.getElementById(this.data.img_url + 'after')
 // 設置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()
}

看完上述內容,你們對怎么在vue項目中實現一個圖片裁剪功能有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

vue
AI

大渡口区| 宝鸡市| 岚皋县| 东兴市| 内黄县| 利津县| 漠河县| 麟游县| 富宁县| 无棣县| 班玛县| 梧州市| 陈巴尔虎旗| 肃宁县| 老河口市| 双鸭山市| 新津县| 驻马店市| 阿瓦提县| 莱芜市| 延津县| 常宁市| 蓝田县| 石林| 天津市| 宜昌市| 集安市| 贞丰县| 九寨沟县| 昌都县| 武汉市| 淅川县| 左权县| 买车| 始兴县| 南汇区| 景东| 隆回县| 搜索| 监利县| 花莲市|