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