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>
|