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