we-cropper 完整上手指南:在微信小程序里快速实现图片裁剪
【免费下载链接】we-cropper微信小程序图片裁剪工具项目地址: https://gitcode.com/gh_mirrors/we/we-cropper
we-cropper 是一款面向微信小程序的 canvas 图片裁剪工具,体积小巧、API 精简,覆盖头像上传、商品图处理、分享图编辑等常见裁剪场景。本文按"场景 → 安装 → 最小可运行流程 → 配置详解 → 进阶与排坑"的顺序带你从零跑通一个 we-cropper 裁剪页,帮你快速把它接入自己的小程序。
它到底解决了什么问题
小程序里要让用户"选一张图 → 框选区域 → 得到裁剪后的图片",自己写意味着要处理 canvas 绘制、手势识别、缩放平移、导出临时文件这一整套逻辑。we-cropper 把这些封装好了:你只需要放一个 canvas 容器、传一份配置、把三个触摸事件转发给它,剩下的缩放、移动、导出都交给实例方法完成。
几个可验证的事实:
- 基于 canvas 渲染,支持传统 canvas 和 canvas2d 两种模式
- 支持多种裁剪比例(通过
cut配置矩形区域)、手势缩放、导出临时文件或 base64 - 提供
ready、beforeImageLoad、imageLoad、beforeDraw等生命周期钩子,方便在绘制前加水印、加载时显示进度 - 完整示例集中在
example/目录,涵盖头像上传、水印、网络图裁剪等场景
两条命令装进项目
如果你用 npm 管理小程序依赖:
npm install we-cropper --save如果要看完整示例或做二次开发,直接克隆仓库:
git clone https://gitcode.com/gh_mirrors/we/we-cropper cd we-cropper克隆下来后重点看example/下的页面,example/normal是最贴近本文流程的标准用法,example/avatarUpload、example/watermark、example/network分别是头像上传、加水印、网络图裁剪的场景。
最小可运行流程
一个能用的裁剪页需要四件事:模板、实例、手势、导出。下面按最小必要片段展示。
1. WXML 里引入裁剪容器
<import src="../we-cropper/we-cropper.wxml"/> <view class="cropper-wrapper"> <template is="we-cropper" data="{{...cropperOpt}}"/> <view class="upload" bindtap="uploadTap">上传图片</view> <view class="getCropperImage" bindtap="getCropperImage">生成图片</view> </view>注意:WXML 里 canvas 的实际宽高,要和 JS 构造参数里的
width、height保持一致,否则裁剪框会错位。
2. JS 里实例化并绑定生命周期
import WeCropper from '../we-cropper/we-cropper.js' const device = wx.getSystemInfoSync() Page({ data: { cropperOpt: { id: 'cropper', targetId: 'targetCropper', pixelRatio: device.pixelRatio, width: device.windowWidth, height: device.windowWidth, scale: 2.5, zoom: 8 } }, onLoad() { this.cropper = new WeCropper(this.data.cropperOpt) .on('beforeImageLoad', () => wx.showToast({ title: '加载中', icon: 'loading' })) .on('imageLoad', () => wx.hideToast()) } })3. 把触摸事件转发给实例
touchStart(e) { this.cropper.touchStart(e) }, touchMove(e) { this.cropper.touchMove(e) }, touchEnd(e) { this.cropper.touchEnd(e) }漏掉这三个方法中的任何一个,手势都会没反应。
4. 载入图片并导出结果
uploadTap() { wx.chooseImage({ count: 1, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success: (res) => this.cropper.pushOrign(res.tempFilePaths[0]) }) }, getCropperImage() { this.cropper.getCropperImage((path, err) => { if (path) wx.previewImage({ urls: [path] }) }) }到这里,一个"选图 → 手势调整 → 得到裁剪图"的闭环就通了。getCropperImage返回的是临时文件路径,后续可以直接wx.uploadFile上传。
关键配置项怎么定
构造参数决定了裁剪框的形态和手感,最常用的是这几个:
| 参数 | 类型 | 说明 |
|---|---|---|
id/targetId | String | 手势 canvas 与导出 canvas 的标识符,必填 |
pixelRatio | Number | 设备像素比,必填,保证高清屏下不糊 |
width/height | Number | 画布宽高(px),须与 WXML 中 canvas 一致 |
cut | Object | 裁剪框{ x, y, width, height },决定输出比例 |
scale | Number | 最大缩放倍数,默认 2.5 |
zoom | Number | 缩放灵敏度,范围 1~10 |
src | String | 初始化时直接载入的图片,相对/临时/存储/网络路径均可 |
头像类场景常把cut设成正方形并居中,例如 200×200 的裁剪框;商品图则按平台要求的比例定width与height。裁剪框边框颜色、线条宽度、遮罩色可通过boundStyle微调。
两种 canvas 渲染模式
默认走的是传统 canvas 上下文,用id/targetId定位组件即可。基础库 2.9.0+ 还支持 canvas2d,适合需要更精细绘制控制的场景。区别在于:canvas2d 要先拿到 canvas 节点和 ctx,手动按pixelRatio放大画布,再把canvas和ctx塞进构造参数。
this.createSelectorQuery() .select(`#${cropperOpt.id}`) .fields({ node: true, size: true }) .exec((res) => { const canvas = res[0].node const ctx = canvas.getContext('2d') const dpr = device.pixelRatio canvas.width = res[0].width * dpr canvas.height = res[0].height * dpr ctx.scale(dpr, dpr) cropperOpt.canvas = canvas cropperOpt.ctx = ctx this.cropper = new WeCropper(cropperOpt) })如果项目要兼容 2.9.0 以下的基础库,建议仍用默认模式;canvas2d 只在明确不需要旧版本时启用。
导出结果与进阶方法
除了getCropperImage导出临时文件,实例还提供几个常用方法:
getCropperBase64(callback):直接拿到 base64,适合需要内联展示的场景(基础库 1.9.0+)pushOrign(src)/removeImage():中途换图、清图(后者自 1.3.9 起支持)updateCanvas():手动刷新画布视图getCropperImage(opt, cb)的opt可继承wx.canvasToTempFilePath参数,设置fileType、quality、original等,也能在自定义组件里传componentContext
想加水印或自定义绘制,用beforeDraw钩子即可,在回调里直接操作ctx画文字或图形。完整的参数与方法签名见 API 文档 与 使用说明。
容易踩的几个坑
- canvas 尺寸不一致:WXML 中 canvas 的宽高必须等于构造参数里的
width/height,这是裁剪框错位的最常见原因。 - 手势失效:确认
touchStart、touchMove、touchEnd三个方法都转发到了实例,且 WXML 里对应绑定了catchtouchstart等事件。 - 图片没载入:
src或pushOrign传入的路径要能被wx.getImageInfo识别;网络图注意域名白名单。 - 基础库版本:canvas2d 模式要求 2.9.0+,base64 导出要求 1.9.0+,低版本要做兼容。
- 导出拿不到路径:回调的第二个参数
err非空时,优先看画布是否已就绪(ready之后再用)。
下一步
本文覆盖了 we-cropper 的核心链路:安装、模板、实例化、手势、导出。接下来建议打开 示例目录 对照example/avatarUpload和example/watermark跑两个完整场景,再把cut比例和boundStyle按你的业务视觉调一遍。如果你需要旋转、更多手势或组件化封装,可以从 源码结构 入手,src/core/scale.js负责缩放逻辑,src/cut.js负责裁剪框计算。
we-cropper 适合所有需要在小程序里做图片裁剪、且不想自己维护 canvas 手势逻辑的团队;下一步就是从example/挑一个最接近你业务的页面,把它改造成你的正式功能页。
【免费下载链接】we-cropper微信小程序图片裁剪工具项目地址: https://gitcode.com/gh_mirrors/we/we-cropper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考