更新记录

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 重写。

许可证

MIT

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT协议

暂无用户评论。