在 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 需要替换为你实际的后端接口地址。可能需要根据实际需求调整裁剪组件的参数,如裁剪框大小、比例等。在某些平台(如小程序)上,可能需要额外的配置或调整才能使用第三方插件。这个方案提供了基本的图片裁剪和上传功能,你可以根据具体需求进行进一步的定制和优化。
网友回复
为啥所有的照片分辨率提升工具都会修改照片上的图案细节?
js如何在浏览器中将webm视频的声音分离为单独音频?
微信小程序如何播放第三方域名url的mp4视频?
ai多模态大模型能实时识别视频中的手语为文字吗?
如何远程调试别人的chrome浏览器获取调试信息?
为啥js打开新网页window.open设置窗口宽高无效?
浏览器中js的navigator.mediaDevices.getDisplayMedia屏幕录像无法录制SpeechSynthesisUtterance产生的说话声音?
js中mediaRecorder如何录制window.speechSynthesis声音音频并下载?
python如何直接获取抖音短视频的音频文件url?
js在浏览器中如何使用MediaStream与MediaRecorder实现声音音频多轨道混流?