Vue中如何进行表单图片裁剪与预览
在前端开发中,表单提交是一个常见的操作。有时候,我们需要上传图片,但是上传的图片可能会非常大,这会增加服务器的负担,同时也会降低用户的体验。因此,我们通常需要对上传的图片进行裁剪和预览。在Vue中,我们可以使用一些第三方库来实现这个功能。
使用第三方库进行图片裁剪
在Vue中,我们可以使用第三方库vue-cropper来进行图片的裁剪。首先,我们需要安装vue-cropper:
npm install vue-cropper --save
然后,在Vue组件中引入vue-cropper:
import VueCropper from 'vue-cropper'
接下来,我们可以在Vue组件中使用vue-cropper的<vue-cropper>
标签来实现图片的裁剪:
<template>
<div>
<input type="file" @change="handleFileChange">
<vue-cropper ref="cropper" :img="img" :outputType="'png'"></vue-cropper>
<button @click="getCroppedImage">获取裁剪后的图片</button>
</div>
</template>
<script>
import VueCropper from 'vue-cropper'
export default {
components: {
VueCropper
},
data () {
return {
img: ''
}
},
methods: {
handleFileChange (event) {
const file = event.target.files[0]
const reader = new FileReader()
reader.onload = (e) => {
this.img = e.target.result
}
reader.readAsDataURL(file)
},
getCroppedImage () {
this.$refs.cropper.getCroppedCanvas().toBlob((blob) => {
console.log(blob)
})
}
}
}
</script>
在上面的代码中,我们首先定义了一个标签,当用户选择图片后,我们将图片转换为base64格式并保存在img变量中。然后,我们使用标签来显示图片,并允许用户进行裁剪。最后,当用户点击“获取裁剪后的图片”按钮时,我们可以使用this.$refs.cropper.getCroppedCanvas().toBlob()
方法获取裁剪后的图片。
使用第三方库进行图片预览
在Vue中,我们可以使用第三方库vue-image-crop-upload来进行图片的预览。首先,我们需要安装vue-image-crop-upload:
npm install vue-image-crop-upload --save
然后,在Vue组件中引入vue-image-crop-upload:
import VueImageCropUpload from 'vue-image-crop-upload'
接下来,我们可以在Vue组件中使用vue-image-crop-upload的<vue-image-crop-upload>
标签来实现图片的预览:
<template>
<div>
<vue-image-crop-upload
ref="cropUpload"
:preview-src="previewSrc"
:img-format="imgFormat"
:img-quality="imgQuality"
:crop-box-ratio="cropBoxRatio"
:crop-box-min-width="cropBoxMinWidth"
:crop-box-min-height="cropBoxMinHeight"
:crop-box-max-width="cropBoxMaxWidth"
:crop-box-max-height="cropBoxMaxHeight"
@crop-success="cropSuccess"
>
<button>选择图片</button>
</vue-image-crop-upload>
</div>
</template>
<script>
import VueImageCropUpload from 'vue-image-crop-upload'
export default {
components: {
VueImageCropUpload
},
data () {
return {
previewSrc: '',
imgFormat: 'jpeg',
imgQuality: 0.8,
cropBoxRatio: 1,
cropBoxMinWidth: 100,
cropBoxMinHeight: 100,
cropBoxMaxWidth: 800,
cropBoxMaxHeight: 800
}
},
methods: {
cropSuccess (dataUrl) {
console.log(dataUrl)
}
}
}
</script>
在上面的代码中,我们使用标签来显示图片,并允许用户进行裁剪和预览。首先,我们定义了一些参数,包括预览图片的src、图片格式、图片质量、裁剪框的比例和大小等。然后,我们定义了一个@crop-success事件,当用户完成图片裁剪后,会触发这个事件,并返回裁剪后的图片的base64格式数据。最后,我们可以将这个数据提交到服务器或者进行其他操作。
将图片裁剪和预览结合起来
在实际开发中,我们通常需要将图片裁剪和预览结合起来,以便用户可以在预览图片的同时进行裁剪。下面是一个示例代码:
<template>
<div>
<vue-image-crop-upload
ref="cropUpload"
:preview-src="previewSrc"
:img-format="imgFormat"
:img-quality="imgQuality"
:crop-box-ratio="cropBoxRatio"
:crop-box-min-width="cropBoxMinWidth"
:crop-box-min-height="cropBoxMinHeight"
:crop-box-max-width="cropBoxMaxWidth"
:crop-box-max-height="cropBoxMaxHeight"
@crop-success="cropSuccess"
>
<button>选择图片</button>
</vue-image-crop-upload>
<vue-cropper
ref="cropper"
:img="cropperImg"
:output-type="'png'"
v-if="showCropper"
></vue-cropper>
<button @click="showCropper = !showCropper">切换裁剪</button>
<button @click="getCroppedImage">获取裁剪后的图片</button>
</div>
</template>
<script>
import VueImageCropUpload from 'vue-image-crop-upload'
import VueCropper from 'vue-cropper'
export default {
components: {
VueImageCropUpload,
VueCropper
},
data () {
return {
previewSrc: '',
imgFormat: 'jpeg',
imgQuality: 0.8,
cropBoxRatio: 1,
cropBoxMinWidth: 100,
cropBoxMinHeight: 100,
cropBoxMaxWidth: 800,
cropBoxMaxHeight: 800,
cropperImg: '',
showCropper: false
}
},
methods: {
cropSuccess (dataUrl) {
this.previewSrc = dataUrl
this.cropperImg = dataUrl
},
getCroppedImage () {
if (this.showCropper) {
this.$refs.cropper.getCroppedCanvas().toBlob((blob) => {
console.log(blob)
})
} else {
this.$refs.cropUpload.getCroppedImage().toBlob((blob) => {
console.log(blob)
})
}
}
}
}
</script>
在上面的代码中,我们首先定义了一个标签用于图片的预览和裁剪,同时也定义了一个标签用于图片的裁剪。然后,我们定义了一个showCropper变量来控制当前显示的是哪个标签。当用户点击“切换裁剪”按钮时,我们可以切换当前显示的标签。最后,当用户点击“获取裁剪后的图片”按钮时,我们可以根据当前显示的标签来获取裁剪后的图片。
结语
在Vue中进行表单图片的裁剪和预览是一个常见的需求。通过使用第三方库vue-cropper和vue-image-crop-upload,我们可以很容易地实现这个功能。同时,我们还可以将图片裁剪和预览结合起来,以提高用户的体验。