mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 10:18:42 +08:00 
			
		
		
		
	
		
			
	
	
		
			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> |