import { Cropper } from "@reglow/reui";
通过 src 设置被裁切的图片,通过 shape 设置裁切框形状。
<script setup>
import { ref } from "vue";
import { Cropper } from "@reglow/reui";
const cropperRef = ref();
const cropperUrl = ref("");
const shape = ref("rect");
const onCrop = () => {
const canvas = cropperRef.value.getCropperCanvas();
cropperUrl.value = canvas.toDataURL();
};
</script>
<template>
<div class="flex gap-4">
<Cropper
ref="cropperRef"
:shape="shape"
src="https://example.com/image.png"
:style="{ width: '550px', height: '300px' }"
/>
<div>
<button @click="onCrop">裁切</button>
<img v-if="cropperUrl" :src="cropperUrl" class="mt-2 max-w-200px" />
</div>
</div>
</template>
支持 rect(方形)、round(圆形)、roundRect(圆角方形)。
<template>
<Cropper src="/image.png" shape="round" :style="{ width: '300px', height: '300px' }" />
<Cropper src="/image.png" shape="roundRect" :style="{ width: '300px', height: '300px' }" />
</template>
通过 aspectRatio 设置固定比例,拖动时裁切框按此比例变化。
<template>
<!-- 3:4 比例 -->
<Cropper
:aspect-ratio="3 / 4"
src="/image.png"
:style="{ width: '550px', height: '300px' }"
/>
</template>
通过 rotate 和 zoom 控制图片旋转和缩放。
<script setup>
import { ref } from "vue";
const rotate = ref(0);
const zoom = ref(1);
</script>
<template>
<div>
<Cropper
:rotate="rotate"
:zoom="zoom"
src="/image.png"
:style="{ width: '550px', height: '300px' }"
@zoom-change="(val) => zoom = val"
/>
<div class="mt-4 flex gap-4">
<div>
<label>旋转: {{ rotate }}°</label>
<input type="range" v-model.number="rotate" min="-360" max="360" />
</div>
<div>
<label>缩放: {{ zoom.toFixed(1) }}</label>
<input type="range" v-model.number="zoom" :min="0.1" :max="3" :step="0.1" />
</div>
</div>
</div>
</template>
组件内置滚轮缩放,滚动鼠标滚轮即可缩放图片。
<template>
<Cropper
src="/image.png"
:min-zoom="0.1"
:max-zoom="3"
:zoom-step="0.1"
@zoom-change="(val) => console.log(val)"
:style="{ width: '550px', height: '300px' }"
/>
</template>
通过 preview 指定预览容器,实时预览裁切效果。
<script setup>
import { ref } from "vue";
const previewRef = ref();
</script>
<template>
<div class="flex gap-4">
<Cropper
src="/image.png"
:preview="() => previewRef.value"
:style="{ width: '550px', height: '300px' }"
/>
<div>
<p>实时预览</p>
<div ref="previewRef" class="w-100px h-100px overflow-hidden border rounded" />
</div>
</div>
</template>
通过 ref 调用 getCropperCanvas 方法获取裁切后的 canvas。
<script setup>
import { ref } from "vue";
const cropperRef = ref();
const getCroppedImage = () => {
const canvas = cropperRef.value.getCropperCanvas();
// 转 base64
const dataUrl = canvas.toDataURL("image/png");
console.log(dataUrl);
// 转 Blob
canvas.toBlob((blob) => {
console.log(blob);
});
};
</script>
<template>
<Cropper ref="cropperRef" src="/image.png" :style="{ width: '550px', height: '300px' }" />
<button @click="getCroppedImage">获取裁切结果</button>
</template>
通过 fill 设置裁切结果中非图片部分的填充色。
<template>
<Cropper
src="/image.png"
fill="rgba(0, 0, 0, 0.5)"
:style="{ width: '550px', height: '300px' }"
/>
</template>
| 参数 | 说明 | 类型 | 默认值 |
|---|
| src | 图片地址 | string | "" |
| shape | 裁切框形状 | rect | round | roundRect | rect |
| aspectRatio | 固定裁切框比例 | number | - |
| defaultAspectRatio | 初始裁切框比例 | number | 1 |
| rotate | 旋转角度 | number | 0 |
| zoom | 缩放比例 | number | 1 |
| minZoom | 最小缩放倍数 | number | 0.1 |
| maxZoom | 最大缩放倍数 | number | 3 |
| zoomStep | 缩放步长 | number | 0.1 |
| fill | 裁切结果填充色 | string | rgba(0, 0, 0, 0) |
| showResizeBox | 是否显示调整块 | boolean | true |
| cropperBoxStyle | 裁切框样式 | CSSProperties | - |
| cropperBoxClassName | 裁切框类名 | string | - |
| preview | 预览容器 | () => HTMLElement | - |
| imgProps | 透传给 img 的属性 | object | - |
| style | 容器样式 | CSSProperties | - |
| class | 附加类名 | string | - |
| 事件 | 说明 | 回调参数 |
|---|
| zoomChange | 缩放回调 | (zoom: number) |
| 方法名 | 说明 | 返回值 |
|---|
| getCropperCanvas | 获取裁切后的 canvas | HTMLCanvasElement |
| shape | 说明 |
|---|
rect | 方形 |
round | 圆形 |
roundRect | 圆角方形 |