所用到的github圖片裁剪插件地址在這
下面直接看例子吧!如需要更改組件UI可自行修改
在/components下新建/CropperImage/index.vue
<template>
<div class="cropper-content">
<div class="cropper-box">
<div class="cropper" :style="`width:${width};height:${height}`">
<vue-cropper
:ref="refName"
:img="option.img"
:output-size="option.outputSize"
:output-type="option.outputType"
:info="option.info"
:can-scale="option.canScale"
:auto-crop="option.autoCrop"
:auto-crop-width="autoCropWidth"
:auto-crop-height="autoCropHeight"
:fixed="option.fixed"
:fixed-number="fixedNumber"
:full="option.full"
:fixed-box="option.fixedBox"
:can-move="option.canMove"
:can-move-box="option.canMoveBox"
:original="option.original"
:center-box="option.centerBox"
:height="option.height"
:info-true="option.infoTrue"
:max-img-size="option.maxImgSize"
:enlarge="enlarge"
:mode="mode"
@realTime="realTime"
@imgLoad="imgLoad"
/>
</div>
<!--底部操作工具按鈕-->
<div class="footer-btn">
<div class="scope-btn">
<label class="btn" :for="refName">選擇{{ name }}</label>
<input
:id="refName"
type="file"
style="position: absolute; clip: rect(0 0 0 0)"
accept="image/png, image/jpeg, image/gif, image/jpg"
@change="selectImg($event)"
/>
</div>
<div class="upload-btn">
<el-button size="mini" type="success" @click="_uploadImg">
上傳{{ name }}
<i class="el-icon-upload" />
</el-button>
</div>
</div>
</div>
<!--預(yù)覽效果圖-->
<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: {
width: {
default: "100%",
},
height: {
default: "100%",
},
// 默認生成截圖框?qū)挾? autoCropWidth: {
default: 230,
},
// 默認生成截圖框高度
autoCropHeight: {
default: 150,
},
fixedNumber: {
default: [375, 245],
},
mode: {
default: "375px 600px",
},
name: {
default: "封面",
},
refName: {},
enlarge: {
default: 1,
},
},
data() {
return {
option: {
img: "", // 裁剪圖片的地址
outputSize: 0.8, // 裁剪生成圖片的質(zhì)量(可選0.1 - 1)
outputType: "jpeg", // 裁剪生成圖片的格式(jpeg || png || webp)
info: true, // 圖片大小信息
canScale: false, // 圖片是否允許滾輪縮放
autoCrop: true, // 是否默認生成截圖框
fixed: true, // 是否開啟截圖框?qū)捀吖潭ū壤? full: false, // false按原比例裁切圖片岁经,不失真
fixedBox: true, // 固定截圖框大小蝙场,不允許改變
canMove: false, // 上傳圖片是否可以移動
canMoveBox: true, // 截圖框能否拖動
original: false, // 上傳圖片按照原始比例渲染
centerBox: true, // 截圖框是否被限制在圖片里面
height: true, // 是否按照設(shè)備的dpr 輸出等比例圖片
infoTrue: true, // true為展示真實輸出圖片寬高诀紊,false展示看到的截圖框?qū)捀? maxImgSize: 3000, // 限制圖片最大寬度和高度
// enlarge: 1, // 圖片根據(jù)截圖框輸出比例倍數(shù)
},
previews: {},
};
},
mounted() {},
methods: {
// 初始化函數(shù)
imgLoad(msg) {},
// 圖片縮放
// 實時預(yù)覽函數(shù)
realTime(data) {
this.previews = data;
},
// 選擇圖片
selectImg(e) {
const 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;
}
// 轉(zhuǎn)化為blob
const 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;
};
// 轉(zhuǎn)化為base64
reader.readAsDataURL(file);
},
// 上傳圖片
_uploadImg(type) {
// 獲取截圖的blob數(shù)據(jù)
this.$refs[this.refName].getCropData(async (data) => {
this.$emit("uploadImgSuccess", data);
});
},
},
};
</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: auto;
}
}
.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;
justify-content: space-between;
.scope-btn {
display: flex;
justify-content: space-between;
padding-right: 10px;
.uploadBox {
margin-right: 10px;
}
}
.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>
<style scoped>
.cropper-content >>> .el-upload-dragger {
width: 100%;
height: 100%;
border: none;
}
</style>
然后就可以在其他文件直接引入了
<template>
<cropper-image
:auto-crop-width="220"
:auto-crop-height="220"
:fixed-number="[220, 220]"
ref-name="specificCropper"
width="220px"
height="220px"
:mode="'220px 220px'"
name="圖片"
:enlarge="5"
@uploadImgSuccess="handleSpecific"
/>
</template>
<script>
import CropperImage from "@/components/CropperImage/index";
// 上傳圖片
handleSpecific(data) {
//data是本地的base64蜓肆,然后調(diào)取后臺的上傳圖片接口就可以了
},
</script>