vue-pro/yudao-vue-ui/pages/set/cutImage/cut.vue

224 lines
4.6 KiB
Vue
Raw Normal View History

2021-11-27 20:09:13 +08:00
<template>
<view class="content">
<view class="title-view" :style="{height: navigationBarHeight + 'px'}">
<navigator open-type="navigateBack" class="back-btn mix-icon icon-xiangzuo"></navigator>
<text class="title">裁剪</text>
<text class="empty"></text>
</view>
<view class="cropper-wrapper">
<canvas
class="cropper"
disable-scroll="true"
@touchstart="touchStart"
@touchmove="touchMove"
@touchend="touchEnd"
:style="{ width: cropperOpt.width, height: cropperOpt.height }"
canvas-id="cropper"
></canvas>
</view>
<view class="cropper-buttons">
<view class="btn upload" @tap="uploadTap">重选</view>
<view class="btn getCropperImage" @tap="getCropperImage">确定</view>
</view>
</view>
</template>
<script>
import weCropper from './cut.js';
const device = uni.getSystemInfoSync();
const width = device.windowWidth;
const height = device.windowHeight;
export default {
data() {
return {
cropperOpt: {
id: 'cropper',
width: width,
height: height,
scale: 2.5,
zoom: 8,
cut: {
x: (width - 200) / 2,
y: (height - this.systemInfo.navigationBarHeight - this.systemInfo.statusBarHeight - 200) / 2,
width: 200,
height: 200
}
},
weCropper: ''
};
},
computed: {
navigationBarHeight(){
console.log(this.systemInfo.navigationBarHeight);
return this.systemInfo.navigationBarHeight;
}
},
onLoad(option) {
// do something
const cropperOpt = this.cropperOpt;
const src = option.src;
console.log(src);
if (src) {
Object.assign(cropperOpt, {
src
});
this.weCropper = new weCropper(cropperOpt)
.on('ready', function(ctx) {})
.on('beforeImageLoad', ctx => {
/* uni.showToast({
title: '上传中',
icon: 'loading',
duration: 3000
}); */
})
.on('imageLoad', ctx => {
uni.hideToast();
});
}
},
methods: {
touchStart(e) {
this.weCropper.touchStart(e);
},
touchMove(e) {
this.weCropper.touchMove(e);
},
touchEnd(e) {
this.weCropper.touchEnd(e);
},
convertBase64UrlToBlob(dataURI, type) {
var binary = atob(dataURI.split(',')[1]);
var array = [];
for (var i = 0; i < binary.length; i++) {
array.push(binary.charCodeAt(i));
}
return new Blob([new Uint8Array(array)], {
type: type
}, {
filename: '1111.jpg'
});
},
blobToDataURL(blob) {
var a = new FileReader();
a.readAsDataURL(blob); //读取文件保存在result中
a.onload = function(e) {
var getRes = e.target.result; //读取的结果在result中
console.log(getRes);
};
},
getCropperImage() {
let _this = this;
this.weCropper.getCropperImage(avatar => {
if (avatar) {
this.$util.prePage().setAvatar(avatar);
uni.navigateBack();
} else {
console.log('获取图片失败,请稍后重试');
}
});
},
uploadTap() {
const self = this;
uni.chooseImage({
count: 1, // 默认9
sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success(res) {
let src = res.tempFilePaths[0];
// 获取裁剪图片资源后给data添加src属性及其值
self.weCropper.pushOrign(src);
}
});
}
},
};
</script>
<style lang="scss">
page, .content{
width: 100%;
height: 100%;
overflow: hidden;
}
.content {
display: flex;
flex-direction: column;
background-color: #000;
padding-top: var(--status-bar-height);
}
.title-view{
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
background: transparent;
.back-btn{
display: flex;
justify-content: center;
align-items: center;
width: 42px;
height: 40px;
font-size: 18px;
color: #fff;
}
.title{
font-size: 17px;
color: #fff;
}
.empty{
width: 42px;
}
}
.cropper {
width: 100%;
flex: 1;
}
.cropper-wrapper {
flex: 1;
position: relative;
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
width: 100%;
background-color: #000;
}
.cropper-buttons {
flex-shrink: 0;
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
height: 50px;
background-color: rgba(0, 0, 0, 0.4);
.btn{
width: 100px;
height: 50px;
line-height: 50px;
font-size: 15px;
color: #fff;
&.upload{
padding-left: 20px;
}
&.getCropperImage{
padding-right: 20px;
text-align: right;
}
}
}
</style>