vue-cropper 的装置
npm install vue-cropper
或
yarn add vue-cropper
只须要一个图片地址和一个导出截取后图片的办法,vue-cropper 在截取图片后会返回一个图片的 base64 数据。
<template>
<div class="cropper-content">
<div class="cropper-box">
<div class="cropper">
<vue-cropper
ref="cropper"
:img="option.img"
:outputSize="option.outputSize"
:outputType="option.outputType"
:info="option.info"
:canScale="option.canScale"
:autoCrop="option.autoCrop"
:autoCropWidth="option.autoCropWidth"
:autoCropHeight="option.autoCropHeight"
:fixed="option.fixed"
:fixedNumber="option.fixedNumber"
:full="option.full"
:fixedBox="option.fixedBox"
:canMove="option.canMove"
:canMoveBox="option.canMoveBox"
:original="option.original"
:centerBox="option.centerBox"
:height="option.height"
:infoTrue="option.infoTrue"
:maxImgSize="option.maxImgSize"
:enlarge="option.enlarge"
:mode="option.mode"
@realTime="realTime"
@imgLoad="imgLoad"
>
</vue-cropper>
</div>
<!-- 底部操作工具按钮 -->
<div class="footer-btn">
<div class="scope-btn">
<label class="btn" for="uploads"> 抉择封面 </label>
<input
type="file"
id="uploads"
style="position: absolute; clip: rect(0 0 0 0)"
accept="image/png, image/jpeg, image/gif, image/jpg"
@change="selectImg($event)"
/>
<el-button
size="mini"
type="danger"
plain
icon="el-icon-zoom-in"
@click="changeScale(1)"
> 放大 </el-button
>
<el-button
size="mini"
type="danger"
plain
icon="el-icon-zoom-out"
@click="changeScale(-1)"
> 放大 </el-button
>
<el-button size="mini" type="danger" plain @click="rotateLeft"
> 左旋转 </el-button
>
<el-button size="mini" type="danger" plain @click="rotateRight"
> 右旋转 </el-button
>
</div>
<div class="upload-btn">
<el-button size="mini" type="success" @click="uploadImg('blob')"
> 上传封面 <i class="el-icon-upload"></i
></el-button>
</div>
</div>
</div>
<!-- 预览效果图 -->
<div class="show-preview">
<div :style="previews.div" class="preview">
<img :src="previews.url" :style="previews.img" />
</div>
</div>
</div>
</template>
<script>
import {VueCropper} from 'vue-cropper';
export default {
name: 'CropperImage',
components: {VueCropper},
props: ['Name'],
data() {
return {
name: this.Name,
previews: {},
option: {
img: '', // 裁剪图片的地址
outputSize: 1, // 裁剪生成图片的品质 (可选 0.1 - 1)
outputType: 'jpeg', // 裁剪生成图片的格局(jpeg || png || webp)info: true, // 图片大小信息
canScale: true, // 图片是否容许滚轮缩放
autoCrop: true, // 是否默认生成截图框
autoCropWidth: 230, // 默认生成截图框宽度
autoCropHeight: 150, // 默认生成截图框高度
fixed: true, // 是否开启截图框宽高固定比例
fixedNumber: [1.53, 1], // 截图框的宽高比例
full: false, //false 按原比例裁切图片,不失真
fixedBox: true, // 固定截图框大小,不容许扭转
canMove: false, // 上传图片是否能够挪动
canMoveBox: true, // 截图框是否拖动
original: false, // 上传图片依照原始比例渲染
centerBox: false, // 截图框是否被限度在图片外面
height: true, // 是否依照设施的 dpr 输入等比例图片
infoTrue: false, //true 为展现实在输入图片宽高,false 展现看到的截图框宽高
maxImgSize: 3000, // 限度图片最大宽度和高度
enlarge: 1, // 图片依据截图框输入比例倍数
mode: '230px 150px' // 图片默认渲染形式
}
};
},
methods: {
// 初始化函数
imgLoad(msg) {console.log('工具初始化函数 =====' + msg);
},
// 图片缩放
changeScale(num) {
num = num || 1;
this.$refs.cropper.changeScale(num);
},
// 向左旋转
rotateLeft() {this.$refs.cropper.rotateLeft();
},
// 向右旋转
rotateRight() {this.$refs.cropper.rotateRight();
},
// 实时预览函数
realTime(data) {this.previews = data;},
// 抉择图片
selectImg(e) {let file = e.target.files[0];
if (!/\.(jpg|jpeg|png|JPG|PNG)$/.test(e.target.value)) {
this.$message({
message: '图片类型要求:jpeg、jpg、png',
type: 'error'
});
return false;
}
// 转化为 blob
let reader = new FileReader();
reader.onload = (e) => {
let data;
if (typeof e.target.result === 'object') {data = window.URL.createObjectURL(new Blob([e.target.result]));
} else {data = e.target.result;}
// 赋值抉择图片的地址
this.option.img = data;
};
// 转化为 base64
reader.readAsDataURL(file);
},
// 上传图片
uploadImg(type) {
let _this = this;
if (type === 'blob') {
// 获取截图的 blob 数据
this.$refs.cropper.getCropBlob(async (data) => {let formData = new FormData();
});
}
}
}
};
</script>
<style scoped lang="scss">
.cropper-content {
display: flex;
display: -webkit-flex;
justify-content: flex-end;
.cropper-box {
flex: 1;
width: 100%;
.cropper {
width: auto;
height: 300px;
}
}
.show-preview {
flex: 1;
-webkit-flex: 1;
display: flex;
display: -webkit-flex;
justify-content: center;
.preview {
overflow: hidden;
border: 1px solid #67c23a;
background: #cccccc;
}
}
}
.footer-btn {
margin-top: 30px;
display: flex;
display: -webkit-flex;
justify-content: flex-end;
.scope-btn {
display: flex;
display: -webkit-flex;
justify-content: space-between;
padding-right: 10px;
}
.upload-btn {
flex: 1;
-webkit-flex: 1;
display: flex;
display: -webkit-flex;
justify-content: center;
}
.btn {
outline: none;
display: inline-block;
line-height: 1;
white-space: nowrap;
cursor: pointer;
-webkit-appearance: none;
text-align: center;
-webkit-box-sizing: border-box;
box-sizing: border-box;
outline: 0;
-webkit-transition: 0.1s;
transition: 0.1s;
font-weight: 500;
padding: 8px 15px;
font-size: 12px;
border-radius: 3px;
color: #fff;
background-color: #409eff;
border-color: #409eff;
margin-right: 10px;
}
}
</style>
预览效果图:
罕用 api 属性形容:
img: '', // 裁剪图片的地址
outputSize: 1, // 裁剪生成图片的品质 (可选 0.1 - 1)
outputType: 'jpeg', // 裁剪生成图片的格局(jpeg || png || webp)info: true, // 图片大小信息
canScale: true, // 图片是否容许滚轮缩放
autoCrop: true, // 是否默认生成截图框
autoCropWidth: 230, // 默认生成截图框宽度
autoCropHeight: 150, // 默认生成截图框高度
fixed: true, // 是否开启截图框宽高固定比例
fixedNumber: [1.53, 1], // 截图框的宽高比例
full: false, //false 按原比例裁切图片,不失真
fixedBox: true, // 固定截图框大小,不容许扭转
canMove: false, // 上传图片是否能够挪动
canMoveBox: true, // 截图框是否拖动
original: false, // 上传图片依照原始比例渲染
centerBox: false, // 截图框是否被限度在图片外面
height: true, // 是否依照设施的 dpr 输入等比例图片
infoTrue: false, //true 为展现实在输入图片宽高,false 展现看到的截图框宽高
maxImgSize: 3000, // 限度图片最大宽度和高度
enlarge: 1, // 图片依据截图框输入比例倍数
mode: '230px 150px' // 图片默认渲染形式