You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

578 lines
15 KiB

<template>
<el-row>
<el-col :span=20>
<div id="boxDiv" :class="boxSize">
<vue-cropper
ref="cropper"
:img="option.img"
:outputSize="option.size"
:outputType="option.outputType"
:info="true"
:full="option.full"
:canMove="option.canMove"
:canMoveBox="option.canMoveBox"
:fixedBox="option.fixedBox"
:original="option.original"
:autoCrop="option.autoCrop"
:autoCropWidth="option.autoCropWidth"
:autoCropHeight="option.autoCropHeight"
@img-load="imgLoad"
></vue-cropper>
</div>
</el-col>
<el-col :span=4>
<el-row>
<el-col :span=24>
<label>等比缩放裁剪边框 </label>
<br>
<el-button icon="el-icon-circle-plus-outline" circle @click="plusCjbk"></el-button><el-button icon="el-icon-remove-outline" circle @click="reduceCjbk"></el-button>
<br>
<el-button @click="recoveryCjbk">恢复{{defaultImgWidth +' X '+ defaultImgHeight}}</el-button>
</el-col>
<el-col :span=24>
<br>
<label>调整画布大小</label>
<br>
<el-button @click="changeCanvasSize('s1')">800 X 600</el-button>
<br>
<el-button @click="changeCanvasSize('s2')">800 X 700</el-button>
<br>
<el-button @click="changeCanvasSize('s3')">800 X 800</el-button>
</el-col>
</el-row>
</el-col>
<div class="test-button">
<!-- <el-button class="bu_bg" type="primary" @click="startCrop" v-if="!crap">开始剪切</el-button>
<el-button class="bu_bg" type="primary" @click="stopCrop" v-else>停止剪切</el-button> -->
<el-tooltip class="item" effect="dark" content="清除裁剪后,可以移动图片" placement="top-start">
<el-button class="bu_bg" v-if="crap==true" type="primary" @click="clearCrop">清除裁剪</el-button>
</el-tooltip>
<el-tooltip class="item" effect="dark" content="为了良好的客户体验,app图片建议控制在50Kb左右,宽400,高300上限,如果是兼容pc的图片,建议宽800,高600为上线" placement="top-start">
<el-button class="bu_bg" v-if="crap==false" type="primary" @click="startCrop">开始裁剪</el-button>
</el-tooltip>
<el-button class="bu_bg" type="primary" @click="rotateLeft">左旋</el-button>
<el-button class="bu_bg" type="primary" @click="rotateRight">右旋</el-button>
<!-- <el-button class="bu_bg" type="primary" @click="finish('base64')">浏览(base64)</el-button>
<el-button class="bu_bg" type="primary" @click="finish('blob')">浏览(blob)</el-button> -->
<el-button class="bu_bg" type="primary" @click="upload('base64')">完成并上传图片</el-button>
<el-tag> 有时候由于网络原因加载图片会需要3-5秒钟,请耐心等候 </el-tag>
</div>
</el-row>
</template>
<script>
//import vueCropper from 'vue-cropper'
import config from '@/common/config';//全局公共库import
import { uploadBase64 } from '@/api/mdp/arc/image';
import screenfull from 'screenfull'
export default {
props:['branchId','image','categoryId','remark','imgWidth','imgHeight','deptid','visible','storedb','fullscreen'],
watch:{
'imgWidth':function(val){
this.option.autoCropWidth = val;
},
'imgHeight':function(val){
this.option.autoCropHeight = val;
},
'visible':function(val){
if(val==true){
}
},
'image':function(image) {
this.selectImg = image;
this.option.img=this.converUrl(image.url);
this.option.autoCropWidth=this.defaultImgWidth
this.option.autoCropHeight=this.defaultImgHeight
//this.imgLoading=true
//this.$refs.cropper.reload()
}
},
data: function () {
return {
model: false,
modelSrc: '',
crap: false,
previews: {},
lists: [
{
/* img: 'http://ofyaji162.bkt.clouddn.com/touxiang.jpg' */
},
{
/* img: 'https://o90cnn3g2.qnssl.com/0C3ABE8D05322EAC3120DDB11F9D1F72.png' */
}
],
boxSize:"s1",
option: {
img: '',
size: 1,
full: false,
outputType: 'png',
canMove: true,
fixedBox: false,
original: false,
canMoveBox: true,
autoCrop: true,
autoCropWidth: this.imgWidth,
autoCropHeight: this.imgHeight,
},
downImg: '#',
selectImg:{categoryId:''},
imgLoading: false
}
},
methods: {
converUrl(url){
if(url!='' && url!=null && !url.indexOf('http')==0 && !url.indexOf('www')==0 && !url.indexOf('data:image/')==0){
return config.getArcImagePath()+"/"+url;
}
return url;
},
changeImg () {
this.option.img = this.lists[~~(Math.random() * this.lists.length)].img
},
startCrop (reload) {
// start
this.crap = true
if(this.imgWidth== undefined ){
this.option.autoCropWidth=600
}else{
this.option.autoCropWidth=this.imgWidth
}
if(this.imgHeight== undefined ){
this.option.autoCropHeight=600
}else{
this.option.autoCropHeight=this.imgHeight
}
this.$refs.cropper.startCrop()
if(reload!=false){
this.$refs.cropper.reload()
}
},
stopCrop () {
// stop
this.crap = false
this.$refs.cropper.stopCrop()
},
clearCrop () {
// clear
this.$refs.cropper.clearCrop()
this.stopCrop ()
},
refreshCrop () {
// clear
this.$refs.cropper.refresh()
},
changeScale (num) {
num = num || 1
this.$refs.cropper.changeScale(num)
},
rotateLeft () {
this.$refs.cropper.rotateLeft()
},
rotateRight () {
this.$refs.cropper.rotateRight()
},
finish (type) {
// 输出
// var test = window.open('about:blank')
// test.document.body.innerHTML = '图片生成中..'
if (type === 'blob') {
this.$refs.cropper.getCropBlob((data) => {
var img = window.URL.createObjectURL(data)
this.model = true
this.modelSrc = img
})
} else {
this.$refs.cropper.getCropData((data) => {
this.model = true
this.modelSrc = data
})
}
},
//调整画布大小
changeCanvasSize(val){
this.boxSize=val
},
// 实时预览函数
realTime (data) {
this.previews = data
},
plusCjbk(){
if(this.crap==false){
this.$message({ message: "请先开始裁剪", type: "warning" });
return;
}
if(this.option.autoCropWidth+this.defaultImgHeight*0.1>800){
this.$message({ message: "不能再放大", type: "warning" });
return;
}
if(this.option.autoCropHeight+this.defaultImgHeight*0.1>800){
this.$message({ message: "不能再放大", type: "warning" });
return;
}
this.option.autoCropWidth=this.option.autoCropWidth+this.defaultImgWidth*0.1
this.option.autoCropHeight=this.option.autoCropHeight+this.defaultImgHeight*0.1
this.$refs.cropper.reload()
},
reduceCjbk(){
if(this.crap==false){
this.$message({ message: "请先开始裁剪", type: "warning" });
return;
}
if(this.option.autoCropWidth-this.defaultImgWidth*0.1<=0){
this.$message({ message: "不能再缩小", type: "warning" });
return;
}
if(this.option.autoCropHeight-this.defaultImgHeight*0.1<=0){
this.$message({ message: "不能再缩小", type: "warning" });
return;
}
this.option.autoCropWidth=this.option.autoCropWidth-this.defaultImgWidth*0.1
this.option.autoCropHeight=this.option.autoCropHeight-this.defaultImgHeight*0.1
this.$refs.cropper.reload()
},
recoveryCjbk(){
if(this.crap==false){
this.$message({ message: "请先开始裁剪", type: "warning" });
return;
}
this.option.autoCropWidth=this.defaultImgWidth
this.option.autoCropHeight=this.defaultImgHeight
this.$refs.cropper.reload()
},
finish2 (type) {
this.$refs.cropper2.getCropData((data) => {
this.model = true
this.modelSrc = data
})
},
finish3 (type) {
this.$refs.cropper3.getCropData((data) => {
this.model = true
this.modelSrc = data
})
},
upload (type) {
// event.preventDefault()
/* var aLink = document.createElement('a')
aLink.download = 'demo' */
// 输出
var params={branchId:this.branchId ,categoryId: this.categoryId, fileData: '', remark: this.remark,name:'',deptid:this.deptid}
if(this.storedb){
params.storedb=this.storedb
}else{
if(this.selectImg.storedb){
params.storedb=this.selectImg.storedb
}
}
//var parm= this.$options.computed.uploadParams();
if(params.categoryId==''||params.categoryId==undefined){
this.$message({ message: "分类不能为空", type: "warning" });
return;
}
if (type === 'blob') {
this.$refs.cropper.getCropBlob((data) => {
/* this.downImg = window.URL.createObjectURL(data)
aLink.href = window.URL.createObjectURL(data)
aLink.click() */
alert("请上传64base");
})
} else {
this.$refs.cropper.getCropData((data) => {
params.fileData=data;
var baseStr=data.substring(data.indexOf('base64,')+'base64,'.length);
var eqTagIndex=baseStr.indexOf("=");
baseStr=eqTagIndex!=-1?baseStr.substring(0,eqTagIndex):baseStr;
var strLen=baseStr.length;
var fileSize=parseInt((strLen-(strLen/8)*2)/1024);
if(fileSize>110 && fileSize<1100){
this.$confirm('图片大小为'+fileSize+'kb,超出建议值, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
params.name=this.selectImg.name+this.selectImg.fileSuffix;
uploadBase64(params).then(res=>{
if(res.data.tips.isOk){
//返回触发父组件的方法
//this.clearCrop ();
var image = res.data.data;
//this.refreshCrop ();
this.$emit('upload-success',image);
}else{
this.$message({ message: "上传错误", type: "warning" });
}
}).catch(()=>{
this.$message.warning("上传失败");
});
}).catch(() => {
this.$message({
type: 'info',
message: '已取消'
});
});
}else{
if(fileSize<=110){
params.name=this.selectImg.name+this.selectImg.fileSuffix;
uploadBase64(params).then(res=>{
if(res.data.tips.isOk){
//返回触发父组件的方法
//this.clearCrop ();
var image = res.data.data;
//this.refreshCrop ();
this.$emit('upload-success',image);
}else{
this.$message({ message: "上传错误", type: "warning" });
}
}).catch(()=>{
this.$message.warning("上传失败");
});
}else{
this.$message({ message: "图片太大,不允许上传,请重新裁剪后上传", type: "warning" });
}
}
//this.$emit('getInfo',this.params);
/* this.downImg = data
aLink.href = data
aLink.click() */
});
}
},
imgLoad(info){
this.imgLoading=false
if(info=='success'){
this.$message({ message: "加载图片成功", type: "success" });
}else{
this.$message({ message: "加载图片失败", type: "error" });
}
},
uploadImg (e, num) {
//上传图片
// this.option.img
var file = e.target.files[0]
if (!/\.(gif|jpg|jpeg|png|bmp|GIF|JPG|PNG)$/.test(e.target.value)) {
alert('图片类型必须是.gif,jpeg,jpg,png,bmp中的一种')
return false
}
var reader = new FileReader()
reader.onload = (e) => {
let data
if (typeof e.target.result === 'object') {
// 把Array Buffer转化为blob 如果是base64不需要
data = window.URL.createObjectURL(new Blob([e.target.result]))
} else {
data = e.target.result
}
if (num === 1) {
this.option.img = data
} else if (num === 2) {
this.example2.img = data
}
}
// 转化为base64
// reader.readAsDataURL(file)
// 转化为blob
reader.readAsArrayBuffer(file)
},
fuselect(){
this.$emit('confirmSelect');
},
imgLoad (msg) {
console.log(msg)
},
handleSuccess(res,file) {
//var jsonData = JSON.stringify(res, null, 4);
//alert(jsonData);
/* var tips= res.tips;
if(tips.isOk){
this.$message({ message: '上传成功', type: 'info' });
}else{
if(tips.msg=='该图片不支持'){
this.$message({ message: '该图片不支持', type: 'info' });
}else{
this.$message({ message: '未知异常', type: 'info' });
}
} */
}
},
components: {
//'vue-cropper':vueCropper,
},
mounted () {
//this.changeImg()
// hljs.configure({useBR: true})
/* var list = [].slice.call(document.querySelectorAll('pre code'))
list.forEach((val, index) => {
hljs.highlightBlock(val)
}) */
this.selectImg = this.image;
this.option.img=this.converUrl(this.image.url);
this.startCrop(false);
this.imgLoading=true
},
computed:{
defaultImgWidth: function(){
let defaultImgWidth=600;
if(this.imgWidth== undefined ){
defaultImgWidth=600
}else{
defaultImgWidth=this.imgWidth
}
return defaultImgWidth;
},
defaultImgHeight: function(){
let defaultImgHeight=600;
if(this.imgHeight== undefined ){
defaultImgHeight=600
}else{
defaultImgHeight=this.imgHeight
}
return defaultImgHeight;
}
}
}
</script>
<style>
* {
margin: 0;
padding: 0;
}
.content {
margin: auto;
max-width: 1200px;
margin-bottom: 100px;
}
.test-button {
padding-top: 30px;
clear: both;
display: flex;
flex-wrap: wrap;
}
.btn {
display: inline-block;
line-height: 1;
white-space: nowrap;
cursor: pointer;
background: #fff;
border: 1px solid #c0ccda;
color: #1f2d3d;
text-align: center;
box-sizing: border-box;
outline: none;
margin:20px 10px 0px 0px;
padding: 9px 15px;
font-size: 14px;
border-radius: 4px;
color: #fff;
background-color: #50bfff;
border-color: #50bfff;
transition: all .2s ease;
text-decoration: none;
user-select: none;
}
.des {
line-height: 30px;
}
.show-info {
margin-bottom: 50px;
text-align: left;
}
.show-info h2 {
line-height: 50px;
}
/*.title, .title:hover, .title-focus, .title:visited {
color: black;
}*/
.s1 {
height: 600px;
width:800px;
float: left;
}
.s2 {
height: 700px;
width:800px;
float: left;
}
.s3 {
height: 800px;
width:800px;
float: left;
}
.app {
height: 300px;
width:400px;
float: left;
}
.show-preview{
float: left;
}
.model {
position: fixed;
z-index: 10;
width: 100vw;
height: 100vh;
overflow: auto;
top: 0;
left: 0;
background: rgba(0, 0, 0, 0.8);
}
.model-show {
display: flex;
justify-content: center;
align-items: center;
width: 100vw;
height: 100vh;
}
.model img {
display: block;
margin: auto;
max-width: 80%;
user-select: none;
background-position: 0px 0px, 10px 10px;
background-size: 20px 20px;
background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee 100%),linear-gradient(45deg, #eee 25%, white 25%, white 75%, #eee 75%, #eee 100%);
}
.c-item {
display: block;
padding: 10px 0;
user-select: none;
}
.bu_bg{
color: #ffffff;
background-color: #50c0fe;
border-color: #50c0fe;
height: 32px;
margin-left: 10px;
}
</style>