vueプロジェクトの中で写真の裁断機能を実現します。
プレゼンテーションアドレス
https://my729.github.io/picture-crop-demo/dist/#/
前言 vueバージョン:3.6.3 https://cli.vuejs.org/zh/ cropperjs:1.5.1 https://github.com/fengyuanchen/cropperjs element UI https://element.eleme.io/#/zh-CN cropperjsプラグインとオリジナルcanvasを使って、写真の裁断機能を実現します。
cropperjsプラグインを使う
cropperjsをインストールします
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
https://github.com/MY729/picture-crop-demo
直接cloneプロジェクトができます。ローカル運行はコードと効果を確認します。
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。
https://my729.github.io/picture-crop-demo/dist/#/
前言
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.crosOrigin='Anonymous'を設定して、そしてサーバーの応答ヘッドはAccess-Coontrol-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を使って写真の裁断を実現します。
マウスのトリミング枠の描画とトリミング枠の移動をサポートします。
考え方:
具体的な実現はソースコードの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()
}
ソースアドレスhttps://github.com/MY729/picture-crop-demo
直接cloneプロジェクトができます。ローカル運行はコードと効果を確認します。
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。