Skip to content

Clipper 图片裁剪

基础用法

  • 内置完整裁剪交互的图片裁剪器:手势拖动/双指缩放图片,8 向手柄调整裁剪框,底部提供比例预设、旋转/镜像工具与还原按钮
  • 点击右上角对勾按钮或调用 crop 方法导出裁剪结果,结果为 base64 图片(PNG),并通过 confirm 事件返回尺寸、比例、旋转等详细信息
  • 可作为卡片嵌入页面,也可配合 fill-viewport 作为整页裁剪器使用
vue
<template>
	<sn-clipper image-url="/static/images/photo.png" @confirm="onConfirm"></sn-clipper>
</template>

更多演示请下载 demo 查看

进阶用法

作为整页裁剪器

设置 fill-viewport 后裁剪区自动占满父容器剩余空间,适合放在全屏页面中。

vue
<template>
	<sn-page fill-content>
		<sn-clipper image-url="/static/images/photo.png" fill-viewport @cancel="onCancel"
			@confirm="onConfirm"></sn-clipper>
	</sn-page>
</template>

自定义比例预设

通过 ratio-list 自定义比例按钮,ratio0 表示自由比例;initial-ratio-id 指定初始选中项。

vue
<template>
	<sn-clipper image-url="/static/images/photo.png" initial-ratio-id="id-card"
		:ratio-list="ratios"></sn-clipper>
</template>
<script lang="uts" setup>
	const ratios = [
		{ id: 'free', text: '自由', ratio: 0 },
		{ id: 'id-card', text: '身份证', ratio: 85.6 / 54.0 }
	] as SnClipperRatioItem[]
</script>

通过 ref 控制

vue
<template>
	<sn-clipper ref="clipperRef" image-url="/static/images/photo.png"></sn-clipper>
</template>
<script lang="uts" setup>
	const clipperRef = ref<SnClipperComponentPublicInstance | null>(null)
	function rotate() {
		clipperRef.value?.$callMethod('rotateClockwise')
	}
	function exportImage() {
		clipperRef.value?.$callMethod('crop')
	}
</script>

属性

参数说明类型默认值可选值
imageUrl要裁剪的图片路径,为空时显示“请传入图片”占位String''-
bgColor裁剪预览区背景颜色,支持 $ 主题色简写String$page-
previewHeight预览区高度,数字单位为 px;fill-viewporttrue 时忽略此值String | Number360-
fillViewport是否让预览区撑满父容器剩余空间(整页裁剪模式)Booleanfalsetrue | false
tabBodyHeight底部工具面板主体区高度(预留,当前未生效,实际高度随字体大小乘数固定)String | Number''-
minCropWidth裁剪框最小宽度,数字单位为 px,为空时不限制String | Number''-
minCropHeight裁剪框最小高度,数字单位为 px,为空时不限制String | Number''-
minScale图片最小缩放比例Number1-
minCropPixels裁剪框对应原图的最小像素边长,用于限制最大放大倍数Number4-
outputScale输出倍率,导出图片尺寸 = 裁剪框尺寸 × 该倍率(再乘设备像素比)Number1-
quality导出图片质量(0-1),当前导出固定为 PNG 格式Number1-
initialRatioId初始选中的比例项 idStringratio-1-1-
ratioList比例预设列表,为空数组时使用默认列表(自由、1:1、3:4、4:3、9:16、16:9)SnClipperRatioItem[]自由、1:1、3:4、4:3、9:16、16:9 六项-
borderColor裁剪框边框与四角颜色String#FFFFFF-
customStyle自定义根节点样式UTSJSONObject | String''-
customClass根节点外部样式类String''-

比例预设项。

名称类型必填描述
idString比例项唯一标识
textString按钮文本
ratioNumber宽高比(宽/高),0 表示自由比例

事件

名称类型说明
ready(detail: UTSJSONObject) => Void图片加载成功时触发,detail 包含 widthheight(图片原始尺寸)与 ratio(当前比例)
change(detail: UTSJSONObject) => Void裁剪状态变化时触发(拖动、缩放、旋转、镜像、切换比例等),detail 包含 rotationflipXflipYscaletranslateXtranslateYcropLeftcropTopcropWidthcropHeightratio
confirm(detail: SnClipperConfirmDetail) => Void裁剪导出成功时触发
cancel() => Void点击取消(×)按钮时触发
error(error: UTSJSONObject) => Void图片加载失败或导出失败时触发,error.message 为错误信息

confirm 事件返回的裁剪导出详情。

名称类型必填描述
dataUrlString裁剪结果 base64 图片数据(PNG)
widthNumber输出图片宽度(像素)
heightNumber输出图片高度(像素)
ratioNumber当前裁剪比例
rotationNumber旋转角度(0/90/180/270)
flipXNumber水平镜像系数(1 正常,-1 镜像)
flipYNumber垂直镜像系数(1 正常,-1 镜像)
imageWidthNumber原图宽度
imageHeightNumber原图高度
cropLeftNumber裁剪框在预览区中的横向位置
cropTopNumber裁剪框在预览区中的纵向位置
cropWidthNumber裁剪框宽度
cropHeightNumber裁剪框高度

方法

名称参数返回值描述
crop--执行裁剪导出,成功后触发 confirm 事件;图片/画布未就绪时 toast 提示
restore--还原所有变换(旋转、镜像、缩放、平移、比例)至初始状态
rotateCounterclockwise--逆时针旋转 90°(别名 rotateLeft
rotateClockwise--顺时针旋转 90°(别名 rotateRight
flipHorizontal--左右镜像
flipVertical--上下镜像
setRatio(item: SnClipperRatioItem)-切换为指定比例项并最大化裁剪框

使用 MIT 协议