224 lines
4.6 KiB
Vue
224 lines
4.6 KiB
Vue
<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>
|