在 uniapp 中实现上传图片前的本地可视化拖拽裁剪功能,我们可以使用第三方插件或自己实现一个简单的裁剪组件。以下是使用 vue-cropper 插件的方法,这个插件在 uniapp 中也可以使用:
首先,安装 vue-cropper 插件:npm install vue-cropper@next然后,在你的 Vue 组件中使用它:
<template>
<view class="container">
<button @tap="chooseImage">选择图片</button>
<view v-if="imageSrc" class="cropper-container">
<vue-cropper
ref="cropper"
:img="imageSrc"
:outputSize="1"
:outputType="outputType"
:info="true"
:full="true"
:canMove="true"
:canMoveBox="true"
:original="false"
:autoCrop="true"
:autoCropWidth="200"
:autoCropHeight="200"
:fixedBox="true"
></vue-cropper>
</view>
<button v-if="imageSrc" @tap="cropImage">裁剪并上传</button>
</view>
</template>
<script>
import { VueCropper } from 'vue-cropper'
export default {
components: {
VueCropper
},
data() {
return {
imageSrc: '',
outputType: 'png'
}
},
methods: {
chooseImage() {
uni.chooseImage({
count: 1,
success: (chooseImageRes) => {
this.imageSrc = chooseImageRes.tempFilePaths[0]
}
})
},
cropImage() {
this.$refs.cropper.getCropBlob((blob) => {
// 这里得到裁剪后的 Blob 对象
// 可以直接上传或者转换为 base64
this.uploadImage(blob)
})
},
uploadImage(blob) {
// 创建 FormData 对象
const formData = new FormData()
formData.append('file', blob, 'cropped_image.png')
// 使用 uni.uploadFile 上传
uni.uploadFile({
url: 'your_upload_url', // 替换为你的上传 URL
filePath: blob,
name: 'file',
formData: formData,
success: (uploadFileRes) => {
console.log('上传成功', uploadFileRes.data)
// 处理上传成功后的逻辑
},
fail: (error) => {
console.error('上传失败', error)
// 处理上传失败的情况
}
})
}
}
}
</script>
<style>
.container {
padding: 20px;
}
.cropper-container {
height: 300px;
width: 100%;
}
</style> 这个实现包括以下步骤:
用户点击"选择图片"按钮,调用 uni.chooseImage 选择图片。选择图片后,将图片显示在 vue-cropper 组件中。用户可以拖拽和缩放图片来调整裁剪区域。点击"裁剪并上传"按钮时,获取裁剪后的图片 Blob 对象。将 Blob 对象通过 uni.uploadFile 上传到服务器。注意事项:
确保在 manifest.json 中配置了相应的权限。上传 URL 需要替换为你实际的后端接口地址。可能需要根据实际需求调整裁剪组件的参数,如裁剪框大小、比例等。在某些平台(如小程序)上,可能需要额外的配置或调整才能使用第三方插件。这个方案提供了基本的图片裁剪和上传功能,你可以根据具体需求进行进一步的定制和优化。
网友回复


