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