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.
223 lines
4.6 KiB
223 lines
4.6 KiB
<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>
|
|
|