mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 20:28:44 +08:00 
			
		
		
		
	
		
			
	
	
		
			632 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
		
		
			
		
	
	
			632 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| 
								 | 
							
								<template>
							 | 
						||
| 
								 | 
							
									<view class="container">
							 | 
						||
| 
								 | 
							
										<view class="page-body uni-content-info">
							 | 
						||
| 
								 | 
							
											<view class='cropper-content'>
							 | 
						||
| 
								 | 
							
												<view v-if="isShowImg" class="uni-corpper" :style="'width:'+cropperInitW+'px;height:'+cropperInitH+'px;background:#000'">
							 | 
						||
| 
								 | 
							
													<view class="uni-corpper-content" :style="'width:'+cropperW+'px;height:'+cropperH+'px;left:'+cropperL+'px;top:'+cropperT+'px'">
							 | 
						||
| 
								 | 
							
														<image :src="imageSrc" :style="'width:'+cropperW+'px;height:'+cropperH+'px'"></image>
							 | 
						||
| 
								 | 
							
														<view class="uni-corpper-crop-box" @touchstart.stop="contentStartMove" @touchmove.stop="contentMoveing" @touchend.stop="contentTouchEnd"
							 | 
						||
| 
								 | 
							
														    :style="'left:'+cutL+'px;top:'+cutT+'px;right:'+cutR+'px;bottom:'+cutB+'px'">
							 | 
						||
| 
								 | 
							
															<view class="uni-cropper-view-box">
							 | 
						||
| 
								 | 
							
																<view class="uni-cropper-dashed-h"></view>
							 | 
						||
| 
								 | 
							
																<view class="uni-cropper-dashed-v"></view>
							 | 
						||
| 
								 | 
							
																<view class="uni-cropper-line-t" data-drag="top" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
							 | 
						||
| 
								 | 
							
																<view class="uni-cropper-line-r" data-drag="right" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
							 | 
						||
| 
								 | 
							
																<view class="uni-cropper-line-b" data-drag="bottom" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
							 | 
						||
| 
								 | 
							
																<view class="uni-cropper-line-l" data-drag="left" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
							 | 
						||
| 
								 | 
							
																<view class="uni-cropper-point point-t" data-drag="top" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
							 | 
						||
| 
								 | 
							
																<view class="uni-cropper-point point-tr" data-drag="topTight"></view>
							 | 
						||
| 
								 | 
							
																<view class="uni-cropper-point point-r" data-drag="right" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
							 | 
						||
| 
								 | 
							
																<view class="uni-cropper-point point-rb" data-drag="rightBottom" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
							 | 
						||
| 
								 | 
							
																<view class="uni-cropper-point point-b" data-drag="bottom" @touchstart.stop="dragStart" @touchmove.stop="dragMove" @touchend.stop="dragEnd"></view>
							 | 
						||
| 
								 | 
							
																<view class="uni-cropper-point point-bl" data-drag="bottomLeft"></view>
							 | 
						||
| 
								 | 
							
																<view class="uni-cropper-point point-l" data-drag="left" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
							 | 
						||
| 
								 | 
							
																<view class="uni-cropper-point point-lt" data-drag="leftTop"></view>
							 | 
						||
| 
								 | 
							
															</view>
							 | 
						||
| 
								 | 
							
														</view>
							 | 
						||
| 
								 | 
							
													</view>
							 | 
						||
| 
								 | 
							
												</view>
							 | 
						||
| 
								 | 
							
											</view>
							 | 
						||
| 
								 | 
							
											<view class='cropper-config'>
							 | 
						||
| 
								 | 
							
												<button type="primary reverse" @click="getImage" style='margin-top: 30rpx;'> 选择头像 </button>
							 | 
						||
| 
								 | 
							
												<button type="warn" @click="getImageInfo" style='margin-top: 30rpx;'> 提交 </button>
							 | 
						||
| 
								 | 
							
											</view>
							 | 
						||
| 
								 | 
							
											<canvas canvas-id="myCanvas" :style="'position:absolute;border: 1px solid red; width:'+imageW+'px;height:'+imageH+'px;top:-9999px;left:-9999px;'"></canvas>
							 | 
						||
| 
								 | 
							
										</view>
							 | 
						||
| 
								 | 
							
									</view>
							 | 
						||
| 
								 | 
							
								</template>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<script>
							 | 
						||
| 
								 | 
							
								  import config from '@/config'
							 | 
						||
| 
								 | 
							
								  import store from "@/store"
							 | 
						||
| 
								 | 
							
								  import { uploadAvatar } from "@/api/system/user"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const baseUrl = config.baseUrl
							 | 
						||
| 
								 | 
							
									let sysInfo = uni.getSystemInfoSync()
							 | 
						||
| 
								 | 
							
									let SCREEN_WIDTH = sysInfo.screenWidth
							 | 
						||
| 
								 | 
							
									let PAGE_X, // 手按下的x位置
							 | 
						||
| 
								 | 
							
										PAGE_Y, // 手按下y的位置
							 | 
						||
| 
								 | 
							
										PR = sysInfo.pixelRatio, // dpi
							 | 
						||
| 
								 | 
							
										T_PAGE_X, // 手移动的时候x的位置
							 | 
						||
| 
								 | 
							
										T_PAGE_Y, // 手移动的时候Y的位置
							 | 
						||
| 
								 | 
							
										CUT_L, // 初始化拖拽元素的left值
							 | 
						||
| 
								 | 
							
										CUT_T, // 初始化拖拽元素的top值
							 | 
						||
| 
								 | 
							
										CUT_R, // 初始化拖拽元素的
							 | 
						||
| 
								 | 
							
										CUT_B, // 初始化拖拽元素的
							 | 
						||
| 
								 | 
							
										CUT_W, // 初始化拖拽元素的宽度
							 | 
						||
| 
								 | 
							
										CUT_H, //  初始化拖拽元素的高度
							 | 
						||
| 
								 | 
							
										IMG_RATIO, // 图片比例
							 | 
						||
| 
								 | 
							
										IMG_REAL_W, // 图片实际的宽度
							 | 
						||
| 
								 | 
							
										IMG_REAL_H, // 图片实际的高度
							 | 
						||
| 
								 | 
							
										DRAFG_MOVE_RATIO = 1, //移动时候的比例,
							 | 
						||
| 
								 | 
							
										INIT_DRAG_POSITION = 100, // 初始化屏幕宽度和裁剪区域的宽度之差,用于设置初始化裁剪的宽度
							 | 
						||
| 
								 | 
							
										DRAW_IMAGE_W = sysInfo.screenWidth // 设置生成的图片宽度
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									export default {
							 | 
						||
| 
								 | 
							
										/**
							 | 
						||
| 
								 | 
							
										 * 页面的初始数据
							 | 
						||
| 
								 | 
							
										 */
							 | 
						||
| 
								 | 
							
										data() {
							 | 
						||
| 
								 | 
							
											return {
							 | 
						||
| 
								 | 
							
												imageSrc: store.getters.avatar,
							 | 
						||
| 
								 | 
							
												isShowImg: false,
							 | 
						||
| 
								 | 
							
												// 初始化的宽高
							 | 
						||
| 
								 | 
							
												cropperInitW: SCREEN_WIDTH,
							 | 
						||
| 
								 | 
							
												cropperInitH: SCREEN_WIDTH,
							 | 
						||
| 
								 | 
							
												// 动态的宽高
							 | 
						||
| 
								 | 
							
												cropperW: SCREEN_WIDTH,
							 | 
						||
| 
								 | 
							
												cropperH: SCREEN_WIDTH,
							 | 
						||
| 
								 | 
							
												// 动态的left top值
							 | 
						||
| 
								 | 
							
												cropperL: 0,
							 | 
						||
| 
								 | 
							
												cropperT: 0,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												transL: 0,
							 | 
						||
| 
								 | 
							
												transT: 0,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												// 图片缩放值
							 | 
						||
| 
								 | 
							
												scaleP: 0,
							 | 
						||
| 
								 | 
							
												imageW: 0,
							 | 
						||
| 
								 | 
							
												imageH: 0,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												// 裁剪框 宽高
							 | 
						||
| 
								 | 
							
												cutL: 0,
							 | 
						||
| 
								 | 
							
												cutT: 0,
							 | 
						||
| 
								 | 
							
												cutB: SCREEN_WIDTH,
							 | 
						||
| 
								 | 
							
												cutR: '100%',
							 | 
						||
| 
								 | 
							
												qualityWidth: DRAW_IMAGE_W,
							 | 
						||
| 
								 | 
							
												innerAspectRadio: DRAFG_MOVE_RATIO
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
										/**
							 | 
						||
| 
								 | 
							
										 * 生命周期函数--监听页面初次渲染完成
							 | 
						||
| 
								 | 
							
										 */
							 | 
						||
| 
								 | 
							
										onReady: function () {
							 | 
						||
| 
								 | 
							
											this.loadImage()
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
										methods: {
							 | 
						||
| 
								 | 
							
											setData: function (obj) {
							 | 
						||
| 
								 | 
							
												let that = this
							 | 
						||
| 
								 | 
							
												Object.keys(obj).forEach(function (key) {
							 | 
						||
| 
								 | 
							
													that.$set(that.$data, key, obj[key])
							 | 
						||
| 
								 | 
							
												})
							 | 
						||
| 
								 | 
							
											},
							 | 
						||
| 
								 | 
							
											getImage: function () {
							 | 
						||
| 
								 | 
							
												var _this = this
							 | 
						||
| 
								 | 
							
												uni.chooseImage({
							 | 
						||
| 
								 | 
							
													success: function (res) {
							 | 
						||
| 
								 | 
							
														_this.setData({
							 | 
						||
| 
								 | 
							
															imageSrc: res.tempFilePaths[0],
							 | 
						||
| 
								 | 
							
														})
							 | 
						||
| 
								 | 
							
														_this.loadImage()
							 | 
						||
| 
								 | 
							
													},
							 | 
						||
| 
								 | 
							
												})
							 | 
						||
| 
								 | 
							
											},
							 | 
						||
| 
								 | 
							
											loadImage: function () {
							 | 
						||
| 
								 | 
							
												var _this = this
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												uni.getImageInfo({
							 | 
						||
| 
								 | 
							
													src: _this.imageSrc,
							 | 
						||
| 
								 | 
							
													success: function success(res) {
							 | 
						||
| 
								 | 
							
														IMG_RATIO = 1 / 1
							 | 
						||
| 
								 | 
							
														if (IMG_RATIO >= 1) {
							 | 
						||
| 
								 | 
							
															IMG_REAL_W = SCREEN_WIDTH
							 | 
						||
| 
								 | 
							
															IMG_REAL_H = SCREEN_WIDTH / IMG_RATIO
							 | 
						||
| 
								 | 
							
														} else {
							 | 
						||
| 
								 | 
							
															IMG_REAL_W = SCREEN_WIDTH * IMG_RATIO
							 | 
						||
| 
								 | 
							
															IMG_REAL_H = SCREEN_WIDTH
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
														let minRange = IMG_REAL_W > IMG_REAL_H ? IMG_REAL_W : IMG_REAL_H
							 | 
						||
| 
								 | 
							
														INIT_DRAG_POSITION = minRange > INIT_DRAG_POSITION ? INIT_DRAG_POSITION : minRange
							 | 
						||
| 
								 | 
							
														// 根据图片的宽高显示不同的效果   保证图片可以正常显示
							 | 
						||
| 
								 | 
							
														if (IMG_RATIO >= 1) {
							 | 
						||
| 
								 | 
							
															let cutT = Math.ceil((SCREEN_WIDTH / IMG_RATIO - (SCREEN_WIDTH / IMG_RATIO - INIT_DRAG_POSITION)) / 2)
							 | 
						||
| 
								 | 
							
															let cutB = cutT
							 | 
						||
| 
								 | 
							
															let cutL = Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH + INIT_DRAG_POSITION) / 2)
							 | 
						||
| 
								 | 
							
															let cutR = cutL
							 | 
						||
| 
								 | 
							
															_this.setData({
							 | 
						||
| 
								 | 
							
																cropperW: SCREEN_WIDTH,
							 | 
						||
| 
								 | 
							
																cropperH: SCREEN_WIDTH / IMG_RATIO,
							 | 
						||
| 
								 | 
							
																// 初始化left right
							 | 
						||
| 
								 | 
							
																cropperL: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH) / 2),
							 | 
						||
| 
								 | 
							
																cropperT: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH / IMG_RATIO) / 2),
							 | 
						||
| 
								 | 
							
																cutL: cutL,
							 | 
						||
| 
								 | 
							
																cutT: cutT,
							 | 
						||
| 
								 | 
							
																cutR: cutR,
							 | 
						||
| 
								 | 
							
																cutB: cutB,
							 | 
						||
| 
								 | 
							
																// 图片缩放值
							 | 
						||
| 
								 | 
							
																imageW: IMG_REAL_W,
							 | 
						||
| 
								 | 
							
																imageH: IMG_REAL_H,
							 | 
						||
| 
								 | 
							
																scaleP: IMG_REAL_W / SCREEN_WIDTH,
							 | 
						||
| 
								 | 
							
																qualityWidth: DRAW_IMAGE_W,
							 | 
						||
| 
								 | 
							
																innerAspectRadio: IMG_RATIO
							 | 
						||
| 
								 | 
							
															})
							 | 
						||
| 
								 | 
							
														} else {
							 | 
						||
| 
								 | 
							
															let cutL = Math.ceil((SCREEN_WIDTH * IMG_RATIO - (SCREEN_WIDTH * IMG_RATIO)) / 2)
							 | 
						||
| 
								 | 
							
															let cutR = cutL
							 | 
						||
| 
								 | 
							
															let cutT = Math.ceil((SCREEN_WIDTH - INIT_DRAG_POSITION) / 2)
							 | 
						||
| 
								 | 
							
															let cutB = cutT
							 | 
						||
| 
								 | 
							
															_this.setData({
							 | 
						||
| 
								 | 
							
																cropperW: SCREEN_WIDTH * IMG_RATIO,
							 | 
						||
| 
								 | 
							
																cropperH: SCREEN_WIDTH,
							 | 
						||
| 
								 | 
							
																// 初始化left right
							 | 
						||
| 
								 | 
							
																cropperL: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH * IMG_RATIO) / 2),
							 | 
						||
| 
								 | 
							
																cropperT: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH) / 2),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																cutL: cutL,
							 | 
						||
| 
								 | 
							
																cutT: cutT,
							 | 
						||
| 
								 | 
							
																cutR: cutR,
							 | 
						||
| 
								 | 
							
																cutB: cutB,
							 | 
						||
| 
								 | 
							
																// 图片缩放值
							 | 
						||
| 
								 | 
							
																imageW: IMG_REAL_W,
							 | 
						||
| 
								 | 
							
																imageH: IMG_REAL_H,
							 | 
						||
| 
								 | 
							
																scaleP: IMG_REAL_W / SCREEN_WIDTH,
							 | 
						||
| 
								 | 
							
																qualityWidth: DRAW_IMAGE_W,
							 | 
						||
| 
								 | 
							
																innerAspectRadio: IMG_RATIO
							 | 
						||
| 
								 | 
							
															})
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
														_this.setData({
							 | 
						||
| 
								 | 
							
															isShowImg: true
							 | 
						||
| 
								 | 
							
														})
							 | 
						||
| 
								 | 
							
														uni.hideLoading()
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
												})
							 | 
						||
| 
								 | 
							
											},
							 | 
						||
| 
								 | 
							
											// 拖动时候触发的touchStart事件
							 | 
						||
| 
								 | 
							
											contentStartMove(e) {
							 | 
						||
| 
								 | 
							
												PAGE_X = e.touches[0].pageX
							 | 
						||
| 
								 | 
							
												PAGE_Y = e.touches[0].pageY
							 | 
						||
| 
								 | 
							
											},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											// 拖动时候触发的touchMove事件
							 | 
						||
| 
								 | 
							
											contentMoveing(e) {
							 | 
						||
| 
								 | 
							
												var _this = this
							 | 
						||
| 
								 | 
							
												var dragLengthX = (PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
							 | 
						||
| 
								 | 
							
												var dragLengthY = (PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
							 | 
						||
| 
								 | 
							
												// 左移
							 | 
						||
| 
								 | 
							
												if (dragLengthX > 0) {
							 | 
						||
| 
								 | 
							
													if (this.cutL - dragLengthX < 0) dragLengthX = this.cutL
							 | 
						||
| 
								 | 
							
												} else {
							 | 
						||
| 
								 | 
							
													if (this.cutR + dragLengthX < 0) dragLengthX = -this.cutR
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if (dragLengthY > 0) {
							 | 
						||
| 
								 | 
							
													if (this.cutT - dragLengthY < 0) dragLengthY = this.cutT
							 | 
						||
| 
								 | 
							
												} else {
							 | 
						||
| 
								 | 
							
													if (this.cutB + dragLengthY < 0) dragLengthY = -this.cutB
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												this.setData({
							 | 
						||
| 
								 | 
							
													cutL: this.cutL - dragLengthX,
							 | 
						||
| 
								 | 
							
													cutT: this.cutT - dragLengthY,
							 | 
						||
| 
								 | 
							
													cutR: this.cutR + dragLengthX,
							 | 
						||
| 
								 | 
							
													cutB: this.cutB + dragLengthY
							 | 
						||
| 
								 | 
							
												})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												PAGE_X = e.touches[0].pageX
							 | 
						||
| 
								 | 
							
												PAGE_Y = e.touches[0].pageY
							 | 
						||
| 
								 | 
							
											},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											contentTouchEnd() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											// 获取图片
							 | 
						||
| 
								 | 
							
											getImageInfo() {
							 | 
						||
| 
								 | 
							
												var _this = this
							 | 
						||
| 
								 | 
							
												uni.showLoading({
							 | 
						||
| 
								 | 
							
													title: '图片生成中...',
							 | 
						||
| 
								 | 
							
												})
							 | 
						||
| 
								 | 
							
												// 将图片写入画布
							 | 
						||
| 
								 | 
							
												const ctx = uni.createCanvasContext('myCanvas')
							 | 
						||
| 
								 | 
							
												ctx.drawImage(_this.imageSrc, 0, 0, IMG_REAL_W, IMG_REAL_H)
							 | 
						||
| 
								 | 
							
												ctx.draw(true, () => {
							 | 
						||
| 
								 | 
							
													// 获取画布要裁剪的位置和宽度   均为百分比 * 画布中图片的宽度    保证了在微信小程序中裁剪的图片模糊  位置不对的问题 canvasT = (_this.cutT / _this.cropperH) * (_this.imageH / pixelRatio)
							 | 
						||
| 
								 | 
							
													var canvasW = ((_this.cropperW - _this.cutL - _this.cutR) / _this.cropperW) * IMG_REAL_W
							 | 
						||
| 
								 | 
							
													var canvasH = ((_this.cropperH - _this.cutT - _this.cutB) / _this.cropperH) * IMG_REAL_H
							 | 
						||
| 
								 | 
							
													var canvasL = (_this.cutL / _this.cropperW) * IMG_REAL_W
							 | 
						||
| 
								 | 
							
													var canvasT = (_this.cutT / _this.cropperH) * IMG_REAL_H
							 | 
						||
| 
								 | 
							
													uni.canvasToTempFilePath({
							 | 
						||
| 
								 | 
							
														x: canvasL,
							 | 
						||
| 
								 | 
							
														y: canvasT,
							 | 
						||
| 
								 | 
							
														width: canvasW,
							 | 
						||
| 
								 | 
							
														height: canvasH,
							 | 
						||
| 
								 | 
							
														destWidth: canvasW,
							 | 
						||
| 
								 | 
							
														destHeight: canvasH,
							 | 
						||
| 
								 | 
							
														quality: 0.5,
							 | 
						||
| 
								 | 
							
														canvasId: 'myCanvas',
							 | 
						||
| 
								 | 
							
														success: function (res) {
							 | 
						||
| 
								 | 
							
															uni.hideLoading()
							 | 
						||
| 
								 | 
							
															let data = {name: 'avatarFile', filePath: res.tempFilePath}
							 | 
						||
| 
								 | 
							
															uploadAvatar(data).then(response => {
							 | 
						||
| 
								 | 
							
																store.commit('SET_AVATAR', response.data)
							 | 
						||
| 
								 | 
							
																uni.showToast({ title: "修改成功", icon: 'success' })
							 | 
						||
| 
								 | 
							
																uni.navigateBack()
							 | 
						||
| 
								 | 
							
															})
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
													})
							 | 
						||
| 
								 | 
							
												})
							 | 
						||
| 
								 | 
							
											},
							 | 
						||
| 
								 | 
							
											// 设置大小的时候触发的touchStart事件
							 | 
						||
| 
								 | 
							
											dragStart(e) {
							 | 
						||
| 
								 | 
							
												T_PAGE_X = e.touches[0].pageX
							 | 
						||
| 
								 | 
							
												T_PAGE_Y = e.touches[0].pageY
							 | 
						||
| 
								 | 
							
												CUT_L = this.cutL
							 | 
						||
| 
								 | 
							
												CUT_R = this.cutR
							 | 
						||
| 
								 | 
							
												CUT_B = this.cutB
							 | 
						||
| 
								 | 
							
												CUT_T = this.cutT
							 | 
						||
| 
								 | 
							
											},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											// 设置大小的时候触发的touchMove事件
							 | 
						||
| 
								 | 
							
											dragMove(e) {
							 | 
						||
| 
								 | 
							
												var _this = this
							 | 
						||
| 
								 | 
							
												var dragType = e.target.dataset.drag
							 | 
						||
| 
								 | 
							
												switch (dragType) {
							 | 
						||
| 
								 | 
							
													case 'right':
							 | 
						||
| 
								 | 
							
														var dragLength = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
							 | 
						||
| 
								 | 
							
														if (CUT_R + dragLength < 0) dragLength = -CUT_R
							 | 
						||
| 
								 | 
							
														this.setData({
							 | 
						||
| 
								 | 
							
															cutR: CUT_R + dragLength
							 | 
						||
| 
								 | 
							
														})
							 | 
						||
| 
								 | 
							
														break
							 | 
						||
| 
								 | 
							
													case 'left':
							 | 
						||
| 
								 | 
							
														var dragLength = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
							 | 
						||
| 
								 | 
							
														if (CUT_L - dragLength < 0) dragLength = CUT_L
							 | 
						||
| 
								 | 
							
														if ((CUT_L - dragLength) > (this.cropperW - this.cutR)) dragLength = CUT_L - (this.cropperW - this.cutR)
							 | 
						||
| 
								 | 
							
														this.setData({
							 | 
						||
| 
								 | 
							
															cutL: CUT_L - dragLength
							 | 
						||
| 
								 | 
							
														})
							 | 
						||
| 
								 | 
							
														break
							 | 
						||
| 
								 | 
							
													case 'top':
							 | 
						||
| 
								 | 
							
														var dragLength = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
							 | 
						||
| 
								 | 
							
														if (CUT_T - dragLength < 0) dragLength = CUT_T
							 | 
						||
| 
								 | 
							
														if ((CUT_T - dragLength) > (this.cropperH - this.cutB)) dragLength = CUT_T - (this.cropperH - this.cutB)
							 | 
						||
| 
								 | 
							
														this.setData({
							 | 
						||
| 
								 | 
							
															cutT: CUT_T - dragLength
							 | 
						||
| 
								 | 
							
														})
							 | 
						||
| 
								 | 
							
														break
							 | 
						||
| 
								 | 
							
													case 'bottom':
							 | 
						||
| 
								 | 
							
														var dragLength = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
							 | 
						||
| 
								 | 
							
														if (CUT_B + dragLength < 0) dragLength = -CUT_B
							 | 
						||
| 
								 | 
							
														this.setData({
							 | 
						||
| 
								 | 
							
															cutB: CUT_B + dragLength
							 | 
						||
| 
								 | 
							
														})
							 | 
						||
| 
								 | 
							
														break
							 | 
						||
| 
								 | 
							
													case 'rightBottom':
							 | 
						||
| 
								 | 
							
														var dragLengthX = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
							 | 
						||
| 
								 | 
							
														var dragLengthY = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if (CUT_B + dragLengthY < 0) dragLengthY = -CUT_B
							 | 
						||
| 
								 | 
							
														if (CUT_R + dragLengthX < 0) dragLengthX = -CUT_R
							 | 
						||
| 
								 | 
							
														let cutB = CUT_B + dragLengthY
							 | 
						||
| 
								 | 
							
														let cutR = CUT_R + dragLengthX
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														this.setData({
							 | 
						||
| 
								 | 
							
															cutB: cutB,
							 | 
						||
| 
								 | 
							
															cutR: cutR
							 | 
						||
| 
								 | 
							
														})
							 | 
						||
| 
								 | 
							
														break
							 | 
						||
| 
								 | 
							
													default:
							 | 
						||
| 
								 | 
							
														break
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								</script>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<style>
							 | 
						||
| 
								 | 
							
									/* pages/uni-cropper/index.wxss */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-content-info {
							 | 
						||
| 
								 | 
							
										/* position: fixed;
							 | 
						||
| 
								 | 
							
										top: 0;
							 | 
						||
| 
								 | 
							
										left: 0;
							 | 
						||
| 
								 | 
							
										right: 0;
							 | 
						||
| 
								 | 
							
										bottom: 0;
							 | 
						||
| 
								 | 
							
										display: block;
							 | 
						||
| 
								 | 
							
										align-items: center;
							 | 
						||
| 
								 | 
							
										flex-direction: column; */
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.cropper-config {
							 | 
						||
| 
								 | 
							
										padding: 20rpx 40rpx;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.cropper-content {
							 | 
						||
| 
								 | 
							
										min-height: 750rpx;
							 | 
						||
| 
								 | 
							
										width: 100%;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-corpper {
							 | 
						||
| 
								 | 
							
										position: relative;
							 | 
						||
| 
								 | 
							
										overflow: hidden;
							 | 
						||
| 
								 | 
							
										-webkit-user-select: none;
							 | 
						||
| 
								 | 
							
										-moz-user-select: none;
							 | 
						||
| 
								 | 
							
										-ms-user-select: none;
							 | 
						||
| 
								 | 
							
										user-select: none;
							 | 
						||
| 
								 | 
							
										-webkit-tap-highlight-color: transparent;
							 | 
						||
| 
								 | 
							
										-webkit-touch-callout: none;
							 | 
						||
| 
								 | 
							
										box-sizing: border-box;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-corpper-content {
							 | 
						||
| 
								 | 
							
										position: relative;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-corpper-content image {
							 | 
						||
| 
								 | 
							
										display: block;
							 | 
						||
| 
								 | 
							
										width: 100%;
							 | 
						||
| 
								 | 
							
										min-width: 0 !important;
							 | 
						||
| 
								 | 
							
										max-width: none !important;
							 | 
						||
| 
								 | 
							
										height: 100%;
							 | 
						||
| 
								 | 
							
										min-height: 0 !important;
							 | 
						||
| 
								 | 
							
										max-height: none !important;
							 | 
						||
| 
								 | 
							
										image-orientation: 0deg !important;
							 | 
						||
| 
								 | 
							
										margin: 0 auto;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									/* 移动图片效果 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-cropper-drag-box {
							 | 
						||
| 
								 | 
							
										position: absolute;
							 | 
						||
| 
								 | 
							
										top: 0;
							 | 
						||
| 
								 | 
							
										right: 0;
							 | 
						||
| 
								 | 
							
										bottom: 0;
							 | 
						||
| 
								 | 
							
										left: 0;
							 | 
						||
| 
								 | 
							
										cursor: move;
							 | 
						||
| 
								 | 
							
										background: rgba(0, 0, 0, 0.6);
							 | 
						||
| 
								 | 
							
										z-index: 1;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									/* 内部的信息 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-corpper-crop-box {
							 | 
						||
| 
								 | 
							
										position: absolute;
							 | 
						||
| 
								 | 
							
										background: rgba(255, 255, 255, 0.3);
							 | 
						||
| 
								 | 
							
										z-index: 2;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-corpper-crop-box .uni-cropper-view-box {
							 | 
						||
| 
								 | 
							
										position: relative;
							 | 
						||
| 
								 | 
							
										display: block;
							 | 
						||
| 
								 | 
							
										width: 100%;
							 | 
						||
| 
								 | 
							
										height: 100%;
							 | 
						||
| 
								 | 
							
										overflow: visible;
							 | 
						||
| 
								 | 
							
										outline: 1rpx solid #69f;
							 | 
						||
| 
								 | 
							
										outline-color: rgba(102, 153, 255, .75)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									/* 横向虚线 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-cropper-dashed-h {
							 | 
						||
| 
								 | 
							
										position: absolute;
							 | 
						||
| 
								 | 
							
										top: 33.33333333%;
							 | 
						||
| 
								 | 
							
										left: 0;
							 | 
						||
| 
								 | 
							
										width: 100%;
							 | 
						||
| 
								 | 
							
										height: 33.33333333%;
							 | 
						||
| 
								 | 
							
										border-top: 1rpx dashed rgba(255, 255, 255, 0.5);
							 | 
						||
| 
								 | 
							
										border-bottom: 1rpx dashed rgba(255, 255, 255, 0.5);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									/* 纵向虚线 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-cropper-dashed-v {
							 | 
						||
| 
								 | 
							
										position: absolute;
							 | 
						||
| 
								 | 
							
										left: 33.33333333%;
							 | 
						||
| 
								 | 
							
										top: 0;
							 | 
						||
| 
								 | 
							
										width: 33.33333333%;
							 | 
						||
| 
								 | 
							
										height: 100%;
							 | 
						||
| 
								 | 
							
										border-left: 1rpx dashed rgba(255, 255, 255, 0.5);
							 | 
						||
| 
								 | 
							
										border-right: 1rpx dashed rgba(255, 255, 255, 0.5);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									/* 四个方向的线  为了之后的拖动事件*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-cropper-line-t {
							 | 
						||
| 
								 | 
							
										position: absolute;
							 | 
						||
| 
								 | 
							
										display: block;
							 | 
						||
| 
								 | 
							
										width: 100%;
							 | 
						||
| 
								 | 
							
										background-color: #69f;
							 | 
						||
| 
								 | 
							
										top: 0;
							 | 
						||
| 
								 | 
							
										left: 0;
							 | 
						||
| 
								 | 
							
										height: 1rpx;
							 | 
						||
| 
								 | 
							
										opacity: 0.1;
							 | 
						||
| 
								 | 
							
										cursor: n-resize;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-cropper-line-t::before {
							 | 
						||
| 
								 | 
							
										content: '';
							 | 
						||
| 
								 | 
							
										position: absolute;
							 | 
						||
| 
								 | 
							
										top: 50%;
							 | 
						||
| 
								 | 
							
										right: 0rpx;
							 | 
						||
| 
								 | 
							
										width: 100%;
							 | 
						||
| 
								 | 
							
										-webkit-transform: translate3d(0, -50%, 0);
							 | 
						||
| 
								 | 
							
										transform: translate3d(0, -50%, 0);
							 | 
						||
| 
								 | 
							
										bottom: 0;
							 | 
						||
| 
								 | 
							
										height: 41rpx;
							 | 
						||
| 
								 | 
							
										background: transparent;
							 | 
						||
| 
								 | 
							
										z-index: 11;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-cropper-line-r {
							 | 
						||
| 
								 | 
							
										position: absolute;
							 | 
						||
| 
								 | 
							
										display: block;
							 | 
						||
| 
								 | 
							
										background-color: #69f;
							 | 
						||
| 
								 | 
							
										top: 0;
							 | 
						||
| 
								 | 
							
										right: 0rpx;
							 | 
						||
| 
								 | 
							
										width: 1rpx;
							 | 
						||
| 
								 | 
							
										opacity: 0.1;
							 | 
						||
| 
								 | 
							
										height: 100%;
							 | 
						||
| 
								 | 
							
										cursor: e-resize;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-cropper-line-r::before {
							 | 
						||
| 
								 | 
							
										content: '';
							 | 
						||
| 
								 | 
							
										position: absolute;
							 | 
						||
| 
								 | 
							
										top: 0;
							 | 
						||
| 
								 | 
							
										left: 50%;
							 | 
						||
| 
								 | 
							
										width: 41rpx;
							 | 
						||
| 
								 | 
							
										-webkit-transform: translate3d(-50%, 0, 0);
							 | 
						||
| 
								 | 
							
										transform: translate3d(-50%, 0, 0);
							 | 
						||
| 
								 | 
							
										bottom: 0;
							 | 
						||
| 
								 | 
							
										height: 100%;
							 | 
						||
| 
								 | 
							
										background: transparent;
							 | 
						||
| 
								 | 
							
										z-index: 11;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-cropper-line-b {
							 | 
						||
| 
								 | 
							
										position: absolute;
							 | 
						||
| 
								 | 
							
										display: block;
							 | 
						||
| 
								 | 
							
										width: 100%;
							 | 
						||
| 
								 | 
							
										background-color: #69f;
							 | 
						||
| 
								 | 
							
										bottom: 0;
							 | 
						||
| 
								 | 
							
										left: 0;
							 | 
						||
| 
								 | 
							
										height: 1rpx;
							 | 
						||
| 
								 | 
							
										opacity: 0.1;
							 | 
						||
| 
								 | 
							
										cursor: s-resize;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-cropper-line-b::before {
							 | 
						||
| 
								 | 
							
										content: '';
							 | 
						||
| 
								 | 
							
										position: absolute;
							 | 
						||
| 
								 | 
							
										top: 50%;
							 | 
						||
| 
								 | 
							
										right: 0rpx;
							 | 
						||
| 
								 | 
							
										width: 100%;
							 | 
						||
| 
								 | 
							
										-webkit-transform: translate3d(0, -50%, 0);
							 | 
						||
| 
								 | 
							
										transform: translate3d(0, -50%, 0);
							 | 
						||
| 
								 | 
							
										bottom: 0;
							 | 
						||
| 
								 | 
							
										height: 41rpx;
							 | 
						||
| 
								 | 
							
										background: transparent;
							 | 
						||
| 
								 | 
							
										z-index: 11;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-cropper-line-l {
							 | 
						||
| 
								 | 
							
										position: absolute;
							 | 
						||
| 
								 | 
							
										display: block;
							 | 
						||
| 
								 | 
							
										background-color: #69f;
							 | 
						||
| 
								 | 
							
										top: 0;
							 | 
						||
| 
								 | 
							
										left: 0;
							 | 
						||
| 
								 | 
							
										width: 1rpx;
							 | 
						||
| 
								 | 
							
										opacity: 0.1;
							 | 
						||
| 
								 | 
							
										height: 100%;
							 | 
						||
| 
								 | 
							
										cursor: w-resize;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-cropper-line-l::before {
							 | 
						||
| 
								 | 
							
										content: '';
							 | 
						||
| 
								 | 
							
										position: absolute;
							 | 
						||
| 
								 | 
							
										top: 0;
							 | 
						||
| 
								 | 
							
										left: 50%;
							 | 
						||
| 
								 | 
							
										width: 41rpx;
							 | 
						||
| 
								 | 
							
										-webkit-transform: translate3d(-50%, 0, 0);
							 | 
						||
| 
								 | 
							
										transform: translate3d(-50%, 0, 0);
							 | 
						||
| 
								 | 
							
										bottom: 0;
							 | 
						||
| 
								 | 
							
										height: 100%;
							 | 
						||
| 
								 | 
							
										background: transparent;
							 | 
						||
| 
								 | 
							
										z-index: 11;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-cropper-point {
							 | 
						||
| 
								 | 
							
										width: 5rpx;
							 | 
						||
| 
								 | 
							
										height: 5rpx;
							 | 
						||
| 
								 | 
							
										background-color: #69f;
							 | 
						||
| 
								 | 
							
										opacity: .75;
							 | 
						||
| 
								 | 
							
										position: absolute;
							 | 
						||
| 
								 | 
							
										z-index: 3;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.point-t {
							 | 
						||
| 
								 | 
							
										top: -3rpx;
							 | 
						||
| 
								 | 
							
										left: 50%;
							 | 
						||
| 
								 | 
							
										margin-left: -3rpx;
							 | 
						||
| 
								 | 
							
										cursor: n-resize;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.point-tr {
							 | 
						||
| 
								 | 
							
										top: -3rpx;
							 | 
						||
| 
								 | 
							
										left: 100%;
							 | 
						||
| 
								 | 
							
										margin-left: -3rpx;
							 | 
						||
| 
								 | 
							
										cursor: n-resize;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.point-r {
							 | 
						||
| 
								 | 
							
										top: 50%;
							 | 
						||
| 
								 | 
							
										left: 100%;
							 | 
						||
| 
								 | 
							
										margin-left: -3rpx;
							 | 
						||
| 
								 | 
							
										margin-top: -3rpx;
							 | 
						||
| 
								 | 
							
										cursor: n-resize;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.point-rb {
							 | 
						||
| 
								 | 
							
										left: 100%;
							 | 
						||
| 
								 | 
							
										top: 100%;
							 | 
						||
| 
								 | 
							
										-webkit-transform: translate3d(-50%, -50%, 0);
							 | 
						||
| 
								 | 
							
										transform: translate3d(-50%, -50%, 0);
							 | 
						||
| 
								 | 
							
										cursor: n-resize;
							 | 
						||
| 
								 | 
							
										width: 36rpx;
							 | 
						||
| 
								 | 
							
										height: 36rpx;
							 | 
						||
| 
								 | 
							
										background-color: #69f;
							 | 
						||
| 
								 | 
							
										position: absolute;
							 | 
						||
| 
								 | 
							
										z-index: 1112;
							 | 
						||
| 
								 | 
							
										opacity: 1;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.point-b {
							 | 
						||
| 
								 | 
							
										left: 50%;
							 | 
						||
| 
								 | 
							
										top: 100%;
							 | 
						||
| 
								 | 
							
										margin-left: -3rpx;
							 | 
						||
| 
								 | 
							
										margin-top: -3rpx;
							 | 
						||
| 
								 | 
							
										cursor: n-resize;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.point-bl {
							 | 
						||
| 
								 | 
							
										left: 0%;
							 | 
						||
| 
								 | 
							
										top: 100%;
							 | 
						||
| 
								 | 
							
										margin-left: -3rpx;
							 | 
						||
| 
								 | 
							
										margin-top: -3rpx;
							 | 
						||
| 
								 | 
							
										cursor: n-resize;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.point-l {
							 | 
						||
| 
								 | 
							
										left: 0%;
							 | 
						||
| 
								 | 
							
										top: 50%;
							 | 
						||
| 
								 | 
							
										margin-left: -3rpx;
							 | 
						||
| 
								 | 
							
										margin-top: -3rpx;
							 | 
						||
| 
								 | 
							
										cursor: n-resize;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.point-lt {
							 | 
						||
| 
								 | 
							
										left: 0%;
							 | 
						||
| 
								 | 
							
										top: 0%;
							 | 
						||
| 
								 | 
							
										margin-left: -3rpx;
							 | 
						||
| 
								 | 
							
										margin-top: -3rpx;
							 | 
						||
| 
								 | 
							
										cursor: n-resize;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									/* 裁剪框预览内容 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-cropper-viewer {
							 | 
						||
| 
								 | 
							
										position: relative;
							 | 
						||
| 
								 | 
							
										width: 100%;
							 | 
						||
| 
								 | 
							
										height: 100%;
							 | 
						||
| 
								 | 
							
										overflow: hidden;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									.uni-cropper-viewer image {
							 | 
						||
| 
								 | 
							
										position: absolute;
							 | 
						||
| 
								 | 
							
										z-index: 2;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								</style>
							 |