更新记录
1.0.0(2026-10-16) 下载此版本
1.0.0
- 首个版本发布
- 支持双指缩放、单指拖动图片
- 支持拖拽裁剪框、拖拽四角手柄调整裁剪框大小(保持宽高比)
- 支持 90° 旋转
- 支持自定义输出尺寸、裁剪比例与强调色
- 零第三方依赖
平台兼容性
uni-app(4.87)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | - | - | - | × | √ | √ | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | - | - |
snow-image-cropper 图片裁剪组件
基于 canvas 实现的 uni-app 图片裁剪组件。零第三方依赖,单文件引入,适用于头像上传、封面裁剪、图文配图等需要按固定比例裁剪图片的场景。
特性
- 双指缩放 / 单指拖动,图片始终覆盖裁剪框,不会出现空白
- 拖拽裁剪框整体移动,拖拽四角 L 形手柄调整裁剪框大小(自动保持传入的宽高比,对角固定)
- 90° 旋转(每次 90°)
- 自定义导出尺寸(
outputWidth/outputHeight)与裁剪比例(ratio) - 自定义强调色(
accentColor) - 裁剪框内三分辅助线,便于构图
- 组件内部自动测量画布尺寸并居中,无需外部计算布局
平台支持
| 平台 | 是否支持 |
|---|---|
| App - Android | ✅ 4.87+ |
| App - iOS | ✅ 12+ |
| App - iPad | ✅ |
| H5 / Web | 未验证(返回值为 base64,见下方 FAQ) |
| 小程序 | 不支持(小程序原生 canvas 组件层级问题,蒙层会遮挡按钮) |
| uni-app x | 不支持(依赖老式 canvas 方案) |
基于
canvas-id+uni.createCanvasContext的老式canvas 方案实现,仅在 App 端(vue 页面,非 nvue)验证通过。
安装
// 从插件市场搜索「图片裁剪组件」导入,或手动将本目录放到项目的 uni_modules 下
组件符合 easycom 规范,导入到 uni_modules/snow-image-cropper/ 后无需注册即可使用:
<!-- 标签名即插件名:snow-image-cropper -->
<snow-image-cropper ref="cropper" :visible="visible" :src="src" />
使用示例
<template>
<view class="page">
<image v-if="croppedPath" :src="croppedPath" mode="aspectFill"
style="width: 200rpx; height: 200rpx; border-radius: 12rpx;"></image>
<button @click="chooseImage">选择图片</button>
<!-- 裁剪组件:visible 控制显示,src 传图片路径 -->
<snow-image-cropper
:visible="visible"
:src="src"
:ratio="1"
:output-width="500"
:output-height="500"
:accent-color="'#0E8D6E'"
@confirm="onConfirm"
@cancel="onCancel"
/>
</view>
</template>
<script>
export default {
data() {
return {
visible: false,
src: '',
croppedPath: ''
}
},
methods: {
chooseImage() {
uni.chooseImage({
count: 1,
sourceType: ['album', 'camera'],
success: (res) => {
this.src = res.tempFilePaths[0]
this.visible = true
}
})
},
onConfirm(tempFilePath) {
this.croppedPath = tempFilePath
this.visible = false
},
onCancel() {
this.visible = false
}
}
}
</script>
属性说明
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
visible |
Boolean | false |
是否显示裁剪器。改为 true 时自动初始化画布 |
src |
String | '' |
待裁剪图片路径,支持本地临时路径与网络地址 |
ratio |
Number | 0 |
裁剪框宽高比(宽/高)。传 0 时由 outputWidth / outputHeight 推导 |
outputWidth |
Number | 500 |
导出图片宽度(px) |
outputHeight |
Number | 500 |
导出图片高度(px)。ratio > 0 时由 outputWidth / ratio 推导 |
accentColor |
String | #0E8D6E |
「确定」按钮的强调色 |
事件说明
| 事件 | 参数 | 说明 |
|---|---|---|
@confirm |
tempFilePath: String |
点击「确定」裁剪成功,返回裁剪后图片的本地临时路径 |
@cancel |
无 | 点击「取消」触发。图片加载失败时也会触发此事件 |
常见问题
Q:组件是全覆盖遮罩,会不会挡住页面其他元素?
会。visible 为 true 时会渲染一个 position: fixed、z-index: 999999 的全屏遮罩,请在 @cancel / @confirm 中及时把 visible 置回 false。
Q:为什么小程序不支持? 小程序原生 canvas 属于原生组件,层级最高,会盖住上层的 footer 按钮,导致「确定」「取消」无法点击。
Q:H5 端返回的值和 App 端不一样吗?
不一样。H5 上 uni.canvasToTempFilePath 返回的是 base64 数据字符串,不是本地临时路径。若要在 H5 使用,@confirm 回调里拿到的值需自行判断是路径还是 base64 再处理。本插件未在 H5 上做过完整验证。
Q:nvue 为什么不支持?
nvue 不支持 canvas-id 的 uni.createCanvasContext 方案,需要改用 subNVue 或 uvue 重写。

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 1
赞赏 0
下载 12687886
赞赏 1956
赞赏
京公网安备:11010802035340号