概述
父组件
父组件中应用pdateImgBase64组件
<div class="trademark">
<updateImgBase64 ref="updateImgBase64" :imageUrl.sync="refineData[row.prop]">
<template slot="商标">
<el-button v-if="refineData[row.prop]" type="text"
@click="$refs.updateImgBase64.showCropBox = true">image/jpeg</el-button>
<el-button v-else type="primary" @click="$refs.updateImgBase64.showCropBox = true">上传文件</el-button>
</template>
</updateImgBase64>
</div>
子组件
子组件以弹窗形式进行裁剪图片
<template>
<div>
<el-dialog title="图片剪裁" :visible.sync="showCropBox" append-to-body width="950px" :before-close="abolishCropping">
<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">
</vue-cropper>
</div>
<!--底部操作工具按钮-->
<div class="footer-btn">
<div class="upload-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)">
</div>
<div class="scope-btn">
<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>
</div>
<!--预览效果图-->
<div class="show-preview">
<div :style="previews.div" class="preview">
<img :src="previews.url" :style="previews.img">
</div>
<div class="preview-foot">
<el-button type="success" @click="finishCropping">裁剪完成</el-button>
<el-button type="warning" @click="abolishCropping">废除裁剪</el-button>
</div>
</div>
</div>
</el-dialog>
<slot name="商标"></slot>
</div>
</template>
<script>
import { VueCropper } from 'vue-cropper'
export default {
name: "CropperImage",
components: {
VueCropper
},
props: {
imageUrl: {
type: String,
default: ''
},
name: {
type: String,
default: ''
}
},
watch: {
imageUrl(val) {
this.option.img = val
}
},
data() {
return {
showCropBox: false,
previews: {},
option: {
img: '', //裁剪图片的地址
outputSize: 1, //裁剪生成图片的质量(可选0.1 - 1)
outputType: 'jpeg', //裁剪生成图片的格式(jpeg || png || webp)
info: true, //裁剪框的大小信息,图片大小信息
canScale: true, //图片是否允许滚轮缩放
autoCrop: true, //是否默认生成截图框
autoCropWidth: 300, //默认生成截图框宽度
autoCropHeight: 100, //默认生成截图框高度
fixed: true, //是否开启截图框宽高固定比例
fixedNumber: [3, 1], //截图框的宽高比例
full: true, //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: {
//图片缩放
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 (!file) return
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) => {
this.option.img = e.target.result
}
//转化为base64
reader.readAsDataURL(file)
},
//完成裁剪
finishCropping() {
this.$refs.cropper.getCropData(data => {
this.$emit('update:imageUrl', data)
this.abolishCropping()
})
},
abolishCropping() {
this.showCropBox = false
Object.assign(this._data, this.$options.data.call(this))
},
}
}
</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 {
margin: 0 0 20px 10px;
display: flex;
flex-direction: column;
width: 35%;
.preview-foot {
width: 300px;
margin-top: 50px;
.el-button {
display: block;
width: 100%;
margin: 10px 0;
}
.el-button+.el-button {
margin: 0;
}
}
.preview {
width: 100%;
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>
步骤:
1.点击上传按钮
2.
选择图片进行裁剪, 完成后更新父组件base64 废除后关闭子组件
文章借鉴:https://www.jb51.net/article/230191.htm
最后
以上就是开放书包为你收集整理的‘vue-cropper‘ 图片裁剪的全部内容,希望文章能够帮你解决‘vue-cropper‘ 图片裁剪所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复