应用vue3和elementPlus实现上传图片裁剪
参考文章地址:https://chengpeiquan.com/article/vue-picture-cropper.html#demo
<template> <!-- 抉择图片 --> <input ref="uploadInput" type="file" accept="image/jpg, image/jpeg, image/png, image/gif" @change="selectFile" /> <!-- 抉择图片 --> <!-- 后果预览区 --> <div v-if="result.dataURL && result.blobURL"> <p>裁切后的 Base64 图片预览:</p> <div class="preview"> <img :src="result.dataURL" alt="组合式 API" /> </div> <p>裁切后的 Blob 图片预览:</p> <div class="preview"> <img :src="result.blobURL" alt="组合式 API" /> </div> <p>能够按 F12 查看打印的 base64 / blob / file 后果</p> </div> <!-- 后果预览区 --> <!-- 用于裁切的弹窗 --> <el-dialog v-model="isShowDialog" title="图片裁切" :close-on-click-modal="false"> <template #footer> <el-button @click="isShowDialog = false">勾销</el-button> <el-button @click="clear">革除</el-button> <el-button @click="reset">重置</el-button> <el-button type="primary" @click="getResult">裁切</el-button> </template> <!-- 图片裁切插件 --> <VuePictureCropper :boxStyle="{ width: '100%', height: '100%', backgroundColor: '#f8f8f8', margin: 'auto', }" :img="pic" :options="{ viewMode: 1, dragMode: 'crop', aspectRatio: 16 / 9, }" /> <!-- 图片裁切插件 --> </el-dialog> <!-- 用于裁切的弹窗 --></template><script setup>import { reactive, ref } from 'vue'import VuePictureCropper, { cropper } from 'vue-picture-cropper'const isShowDialog = ref(false)const uploadInput = ref(null)const pic = ref('')const result = reactive({ dataURL: '', blobURL: ''})/** * 抉择图片 */const selectFile = (e) => { // 重置上一次的后果 result.dataURL = '' result.blobURL = '' // 如果有多个裁剪框,也须要重置掉裁剪指标的值,防止应用同一张图片无奈触发watch pic.value = '' // 获取选取的文件 const target = e.target const { files } = target if (!files) return const file = files[0] // 转换为base64传给裁切组件 const reader = new FileReader() reader.readAsDataURL(file) reader.onload = () => { // 更新裁切弹窗的图片源 pic.value = String(reader.result) // 显示裁切弹窗 isShowDialog.value = true // 清空已抉择的文件 if (!uploadInput.value) return uploadInput.value.value = '' }}/** * 获取裁切后果 */const getResult = async () => { console.log(cropper) // 获取生成的base64图片地址 const base64 = cropper.getDataURL() // 获取生成的blob文件信息 const blob = await cropper.getBlob() // 获取生成的file文件信息 const file = await cropper.getFile({ fileName: '裁剪头像', }) console.log({ base64, blob, file }) // 把base64赋给后果展示区 result.dataURL = base64 try { result.blobURL = URL.createObjectURL(blob) } catch (e) { result.blobURL = '' } // 暗藏裁切弹窗 isShowDialog.value = false}/** * 革除裁切框 */const clear = () => { cropper.clear()}/** * 重置默认的裁切区域 */const reset = () => { cropper.reset()}</script><style scoped></style>