更新记录
1.0.0(2026-06-02)
- ✨ 初始版本
- ✨ 支持图片选择
- ✨ 支持图片裁剪
- ✨ 支持缩放调整
- ✨ 支持拖拽移动
- ✨ 支持圆形/方形切换
- ✨ 符合 easycom 规范
平台兼容性
uni-app(3.7.8)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | - | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | - | - | - | - | - | - | - | - |
upload-img-cropper-pro
一款功能强大的 uni-app 图片裁剪/头像上传组件,支持图片选择、裁剪、缩放、拖拽等功能,完全符合 easycom 规范,开箱即用。
🎨 功能特性
| 功能 | 描述 | 状态 |
|---|---|---|
| 图片选择 | 支持从相册或相机选择图片 | ✅ |
| 图片裁剪 | 基于 canvas 的精准裁剪 | ✅ |
| 缩放调整 | 支持滑块拖动和点击定位 | ✅ |
| 拖拽移动 | 支持触摸和鼠标拖拽选择区域 | ✅ |
| 圆形头像 | 支持圆形/方形头像切换 | ✅ |
| 自定义尺寸 | 支持自定义宽高 | ✅ |
| 双向绑定 | 支持 v-model 双向绑定 | ✅ |
| 跨平台 | 支持所有 uni-app 平台 | ✅ |
📱 平台兼容性
| 平台 | 支持程度 | 备注 |
|---|---|---|
| 微信小程序 | ✅ 完全支持 | 已测试 |
| H5 | ✅ 完全支持 | 已测试 |
| App(iOS) | ✅ 完全支持 | 已测试 |
| App(Android) | ✅ 完全支持 | 已测试 |
| 支付宝小程序 | ✅ 完全支持 | 理论支持 |
| 百度小程序 | ✅ 完全支持 | 理论支持 |
| 字节跳动小程序 | ✅ 完全支持 | 理论支持 |
📦 安装方式
方式一:npm 安装(推荐)
npm install upload-img-cropper-pro --save
方式二:手动安装
- 下载组件包
- 将
upload-img-cropper-pro文件夹复制到项目的components目录下
方式三:easycom 自动引入(uni-app 推荐)
由于组件符合 easycom 规范,只需将组件放入项目的 components 目录,即可在页面中直接使用,无需手动 import。
easycom 配置(在 pages.json 中):
{
"easycom": {
"autoscan": true,
"custom": {
"^upload-(.*)": "@/components/upload-$1/upload-$1.vue"
}
}
}
🔧 使用方式
基本使用
<template>
<view class="container">
<upload-img-cropper-pro
v-model="avatar"
:width="200"
:height="200"
:circle="true"
@change="onAvatarChange"
></upload-img-cropper-pro>
</view>
</template>
<script>
export default {
data() {
return {
avatar: ''
}
},
methods: {
onAvatarChange(url) {
console.log('头像已更新:', url)
// 可以在这里上传到服务器
this.uploadToServer(url)
},
uploadToServer(url) {
uni.uploadFile({
url: 'https://your-server.com/upload',
filePath: url,
name: 'avatar',
success: (res) => {
console.log('上传成功:', res)
}
})
}
}
}
</script>
进阶使用
1. 方形头像
<upload-img-cropper-pro
v-model="coverImage"
:width="300"
:height="200"
:circle="false"
@change="onCoverChange"
></upload-img-cropper-pro>
2. 自定义尺寸
<upload-img-cropper-pro
v-model="largeAvatar"
:width="400"
:height="400"
:circle="true"
></upload-img-cropper-pro>
3. 配合表单使用
<template>
<view class="form">
<view class="form-item">
<text class="form-label">用户头像</text>
<upload-img-cropper-pro
v-model="formData.avatar"
:width="160"
:height="160"
></upload-img-cropper-pro>
</view>
<view class="form-item">
<text class="form-label">商品封面</text>
<upload-img-cropper-pro
v-model="formData.cover"
:width="300"
:height="200"
:circle="false"
></upload-img-cropper-pro>
</view>
<button @click="submitForm">提交</button>
</view>
</template>
<script>
export default {
data() {
return {
formData: {
avatar: '',
cover: ''
}
}
},
methods: {
submitForm() {
// 验证表单
if (!this.formData.avatar) {
uni.showToast({
title: '请选择头像',
icon: 'none'
})
return
}
// 提交表单
console.log('表单数据:', this.formData)
}
}
}
</script>
📋 Props 参数
| 参数名 | 类型 | 默认值 | 必填 | 说明 |
|---|---|---|---|---|
| value / v-model | String | '' | 否 | 图片路径,支持本地路径和网络路径 |
| width | Number | 200 | 否 | 头像宽度,单位 rpx |
| height | Number | 200 | 否 | 头像高度,单位 rpx |
| circle | Boolean | true | 否 | 是否显示为圆形,true 为圆形,false 为方形 |
🎯 Events 事件
| 事件名 | 说明 | 回调参数 |
|---|---|---|
| input | v-model 双向绑定事件 | (url: String) - 裁剪后的图片临时路径 |
| change | 图片变更事件,裁剪完成后触发 | (url: String) - 裁剪后的图片临时路径 |
🎨 裁剪界面功能
裁剪界面提供以下交互功能:
1. 缩放控制
- 滑块拖动:通过拖动底部滑块调整缩放比例(1-5倍)
- 点击轨道:直接点击滑块轨道快速定位到对应缩放比例
2. 拖拽移动
- 触摸拖拽(移动端):在裁剪区域内用手指拖动图片
- 鼠标拖拽(PC端):在裁剪区域内用鼠标拖动图片
3. 边界限制
- 当图片缩放后超出裁剪区域时,可以自由拖拽选择区域
- 当图片小于裁剪区域时,自动居中且不允许拖拽
🔌 API 说明
组件方法
组件内部调用的 uni-app API:
| API | 用途 | 说明 |
|---|---|---|
uni.chooseImage |
选择图片 | 支持相册和相机 |
uni.getImageInfo |
获取图片信息 | 获取图片宽高等信息 |
uni.createCanvasContext |
创建画布上下文 | 用于绘制和裁剪图片 |
uni.canvasToTempFilePath |
导出裁剪图片 | 将画布内容导出为临时文件 |
uni.createSelectorQuery |
查询节点信息 | 获取 canvas 尺寸 |
📁 项目结构
upload-img-cropper-pro/
├── upload-img-cropper-pro.vue # 组件主文件
├── package.json # 组件配置文件
└── README.md # 组件说明文档
⚠️ 注意事项
- 微信小程序兼容性:微信小程序环境中
document对象不可用,组件已做兼容性处理 - 权限配置:使用相机功能需要在
manifest.json中配置相机权限 - canvas-id 唯一性:页面中如果有多个 canvas,确保 canvas-id 不重复
- 图片大小限制:建议对上传图片大小进行限制,避免过大图片影响性能
🐛 常见问题
Q1: 组件不显示?
A:请检查:
- 组件是否正确放置在
components目录下 pages.json中是否配置了 easycom- 是否有语法错误,可以在控制台查看报错信息
Q2: 裁剪后图片不显示?
A:请检查:
- 确认 canvas-id 唯一
- 确认图片路径正确
- 在微信小程序开发工具中查看是否有报错
Q3: 拖拽功能不生效?
A:请检查:
- 移动端需要使用触摸事件,PC端需要使用鼠标事件
- 确保没有其他元素阻止了事件传递
Q4: 如何上传到服务器?
A:可以在 @change 事件中调用 uni.uploadFile 上传:
onAvatarChange(url) {
uni.uploadFile({
url: 'https://your-server.com/api/upload',
filePath: url,
name: 'file',
success: (res) => {
const data = JSON.parse(res.data)
console.log('上传成功:', data)
},
fail: (err) => {
console.error('上传失败:', err)
}
})
}
🔄 版本更新记录
v1.0.0
- ✨ 初始版本
- ✨ 支持图片选择
- ✨ 支持图片裁剪
- ✨ 支持缩放调整
- ✨ 支持拖拽移动
- ✨ 支持圆形/方形切换
- ✨ 符合 easycom 规范
🤝 贡献指南
欢迎提交 Issue 和 Pull Request!
开发流程
- Fork 本仓库
- 创建功能分支 (
git checkout -b feature/xxx) - 提交代码 (
git commit -m 'feat: add xxx') - 推送到分支 (
git push origin feature/xxx) - 创建 Pull Request
代码规范
- 遵循 uni-app 开发规范
- 使用 ES6+ 语法
- 保持代码简洁清晰
- 添加必要的注释
📄 License
MIT License
📧 联系方式
如有问题或建议,欢迎通过以下方式联系:
- 提交 Issue
- 发送邮件:your-email@example.com
如果这个组件对你有帮助,请给个 Star ⭐️

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 7
赞赏 0
下载 12128359
赞赏 1918
赞赏
京公网安备:11010802035340号