小程序_图片剪切功能(支持多图片上传)

前端图片剪切上传功能是常见的功能,在开发过程中,研发一个这样的功能要花的时间也会很多,现在把一个研发好了的图片剪切插件发出来。支持剪切和大小缩放。



wxml

 1 <!--图片展示 -->
 2 <view bindtap=‘upEwm‘ data-which=‘1‘>
 3   <view>第一个图</view>
 4   <image style=‘width:200rpx;height:200rpx;background-color:red‘ src=‘{{headImg}}‘></image>
 5 </view>
 6 <view bindtap=‘upEwm‘ data-which=‘2‘>
 7   <view>第二个图</view>
 8   <image style=‘width:200rpx;height:200rpx;background-color:red‘ src=‘{{ewmImg}}‘></image>
 9 </view>
10
11
12 <!--裁剪图片浮层-->
13 <view class=‘fixed-upimg‘ wx:if="{{imageFixed}}">
14   <view class="wx-content-info">
15     <!-- <view class="wx-content-info" wx:if="{{imageSrc}}"> -->
16     <view wx:if="{{isShowImg}}" class="wx-corpper" style="width:{{cropperInitW}}rpx;height:{{cropperInitH}}rpx;background:#000">
17       <view bindtap=‘upLoad‘ class="wx-corpper-content" style="width:{{cropperW}}rpx;height:{{cropperH}}rpx;left:{{cropperL}}rpx;top:{{cropperT}}rpx">
18         <image src="{{imageSrc}}" style="width:{{cropperW}}rpx;height:{{cropperH}}rpx"></image>
19         <view class="wx-corpper-crop-box" bindtouchstart="contentStartMove" bindtouchmove="contentMoveing" style="width:{{cutW}}rpx;height:{{cutH}}rpx;left:{{cutL}}rpx;top:{{cutT}}rpx">
20           <view class="wx-cropper-view-box">
21             <!-- <view class="wx-cropper-viewer">
22             <image src="{{imageSrc}}" style="width:{{cropperW}}rpx;height:{{cropperH}}rpx;left:{{cropperL - cutL}}rpx;top:{{cropperT - cutT}}rpx"></image>
23           </view> -->
24             <view class="wx-cropper-dashed-h"></view>
25             <view class="wx-cropper-dashed-v"></view>
26             <view class="wx-cropper-line-t" data-drag="top" catchtouchstart="dragStart" catchtouchmove="dragMove"></view>
27             <view class="wx-cropper-line-r" data-drag="right" catchtouchstart="dragStart" catchtouchmove="dragMove"></view>
28             <view class="wx-cropper-line-b" data-drag="bottom" catchtouchstart="dragStart" catchtouchmove="dragMove"></view>
29             <view class="wx-cropper-line-l" data-drag="left" catchtouchstart="dragStart" catchtouchmove="dragMove"></view>
30             <view class="wx-cropper-point point-t" data-drag="top" catchtouchstart="dragStart" catchtouchmove="dragMove"></view>
31             <view class="wx-cropper-point point-tr" data-drag="topTight"></view>
32             <view class="wx-cropper-point point-r" data-drag="right" catchtouchstart="dragStart" catchtouchmove="dragMove"></view>
33             <view class="wx-cropper-point point-rb" data-drag="rightBottom" catchtouchstart="dragStart" catchtouchmove="dragMove"></view>
34             <view class="wx-cropper-point point-b" data-drag="bottom" catchtouchstart="dragStart" catchtouchmove="dragMove"></view>
35             <view class="wx-cropper-point point-bl" data-drag="bottomLeft"></view>
36             <view class="wx-cropper-point point-l" data-drag="left" catchtouchstart="dragStart" catchtouchmove="dragMove"></view>
37             <view class="wx-cropper-point point-lt" data-drag="leftTop"></view>
38           </view>
39         </view>
40       </view>
41       <!-- <view class="wx-cropper-drag-box"></view> -->
42     </view>
43     <canvas canvas-id="myCanvas" style="position:absolute;border: 1px solid red; width:{{imageW}}rpx;height:{{imageH}}rpx;top:-9999px;left:-9999px;"></canvas>
44     <button type="primary" bindtap="getImageInfo" style="position:fixed;bottom:120rpx;width:90%;left:50%;transform:translate3d(-50%,0,0)"> 确认提交 </button>
45
46   </view>
47 </view>

wxcss

  1 /* pages/wx-cropper/index.wxss */
  2 .fixed-upimg{
  3     position: fixed;
  4   top: 0;
  5   left: 0;
  6   right: 0;
  7   bottom: 0;
  8   background-color: #fff;
  9 }
 10 .wx-content-info{
 11   position: fixed;
 12   top: 130rpx;
 13   left: 0;
 14   right: 0;
 15   bottom: 0;
 16
 17 }
 18
 19 .wx-corpper{
 20   position: relative;
 21   overflow: hidden;
 22   -webkit-user-select: none;
 23   -moz-user-select: none;
 24   -ms-user-select: none;
 25   user-select: none;
 26   -webkit-tap-highlight-color: transparent;
 27   -webkit-touch-callout: none;
 28   box-sizing: border-box;
 29 }
 30
 31 .wx-corpper-content{
 32     position: absolute;
 33     top: 0;
 34     right: 0;
 35     bottom: 0;
 36     left: 0;
 37 }
 38
 39 .wx-corpper-content image {
 40     display: block;
 41     width: 100%;
 42     min-width: 0 !important;
 43     max-width: none !important;
 44     height: 100%;
 45     min-height: 0 !important;
 46     max-height: none !important;
 47     image-orientation: 0deg !important;
 48     margin: 0 auto;
 49 }
 50
 51 /* 移动图片效果 */
 52 .wx-cropper-drag-box{
 53     position: absolute;
 54     top: 0;
 55     right: 0;
 56     bottom: 0;
 57     left: 0;
 58     cursor: move;
 59     background: rgba(0,0,0,0.6);
 60     z-index: 1;
 61 }
 62
 63 /* 内部的信息 */
 64 .wx-corpper-crop-box{
 65     position: absolute;
 66     width: 500rpx;
 67     height: 500rpx;
 68     background: rgba(255,255,255,0.3);
 69     z-index: 2;
 70 }
 71
 72 .wx-corpper-crop-box .wx-cropper-view-box {
 73     position: relative;
 74     display: block;
 75     width: 100%;
 76     height: 100%;
 77     overflow: visible;
 78     outline: 1px solid #69f;
 79     outline-color: rgba(102, 153, 255, .75)
 80 }
 81
 82 /* 横向虚线 */
 83 .wx-cropper-dashed-h{
 84     position: absolute;
 85     top: 33.33333333%;
 86     left: 0;
 87     width: 100%;
 88     height: 33.33333333%;
 89     border-top: 1px dashed rgba(255,255,255,0.5);
 90     border-bottom: 1px dashed rgba(255,255,255,0.5);
 91 }
 92
 93 /* 纵向虚线 */
 94 .wx-cropper-dashed-v{
 95     position: absolute;
 96     left: 33.33333333%;
 97     top: 0;
 98     width: 33.33333333%;
 99     height: 100%;
100     border-left: 1px dashed rgba(255,255,255,0.5);
101     border-right: 1px dashed rgba(255,255,255,0.5);
102 }
103
104 /* 四个方向的线  为了之后的拖动事件*/
105 .wx-cropper-line-t{
106     position: absolute;
107     display: block;
108     width: 100%;
109     background-color: #69f;
110     top: 0;
111     left: 0;
112     height: 1px;
113     opacity: 0.1;
114     cursor: n-resize;
115 }
116
117 .wx-cropper-line-t::before{
118   content: ‘‘;
119   position: absolute;
120   top: 50%;
121   right: 0rpx;
122   width: 100%;
123   -webkit-transform: translate3d(0,-50%,0);
124   transform: translate3d(0,-50%,0);
125   bottom: 0;
126   height: 41rpx;
127   background: transparent;
128   z-index: 11;
129 }
130
131 .wx-cropper-line-r{
132     position: absolute;
133     display: block;
134     background-color: #69f;
135     top: 0;
136     right: 0px;
137     width: 1px;
138     opacity: 0.1;
139     height: 100%;
140     cursor: e-resize;
141 }
142 .wx-cropper-line-r::before{
143   content: ‘‘;
144   position: absolute;
145   top: 0;
146   left: 50%;
147   width: 41rpx;
148   -webkit-transform: translate3d(-50%,0,0);
149   transform: translate3d(-50%,0,0);
150   bottom: 0;
151   height: 100%;
152   background: transparent;
153   z-index: 11;
154 }
155
156 .wx-cropper-line-b{
157     position: absolute;
158     display: block;
159     width: 100%;
160     background-color: #69f;
161     bottom: 0;
162     left: 0;
163     height: 1px;
164     opacity: 0.1;
165     cursor: s-resize;
166 }
167
168 .wx-cropper-line-b::before{
169   content: ‘‘;
170   position: absolute;
171   top: 50%;
172   right: 0rpx;
173   width: 100%;
174   -webkit-transform: translate3d(0,-50%,0);
175   transform: translate3d(0,-50%,0);
176   bottom: 0;
177   height: 41rpx;
178   background: transparent;
179   z-index: 11;
180 }
181
182 .wx-cropper-line-l{
183     position: absolute;
184     display: block;
185     background-color: #69f;
186     top: 0;
187     left: 0;
188     width: 1px;
189     opacity: 0.1;
190     height: 100%;
191     cursor: w-resize;
192 }
193 .wx-cropper-line-l::before{
194   content: ‘‘;
195   position: absolute;
196   top: 0;
197   left: 50%;
198   width: 41rpx;
199   -webkit-transform: translate3d(-50%,0,0);
200   transform: translate3d(-50%,0,0);
201   bottom: 0;
202   height: 100%;
203   background: transparent;
204   z-index: 11;
205 }
206
207 .wx-cropper-point{
208     width: 5px;
209     height: 5px;
210     background-color: #69f;
211     opacity: .75;
212     position: absolute;
213     z-index: 3;
214 }
215
216 .point-t{
217     top: -3px;
218     left: 50%;
219     margin-left: -3px;
220     cursor: n-resize;
221 }
222
223 .point-tr{
224     top: -3px;
225     left: 100%;
226     margin-left: -3px;
227     cursor: n-resize;
228 }
229
230 .point-r{
231     top: 50%;
232     left:100%;
233     margin-left: -3px;
234     margin-top: -3px;
235     cursor: n-resize;
236 }
237
238 .point-rb{
239     left: 100%;
240     top: 100%;
241     -webkit-transform: translate3d(-50%,-50%,0);
242     transform: translate3d(-50%,-50%,0);
243     cursor: n-resize;
244     width: 24rpx;
245     height: 24rpx;
246     background-color: #69f;
247     position: absolute;
248     z-index: 1112;
249     opacity: 1;
250 }
251
252 .point-b{
253     left:50%;
254     top: 100%;
255     margin-left: -3px;
256     margin-top: -3px;
257     cursor: n-resize;
258 }
259
260 .point-bl{
261     left:0%;
262     top: 100%;
263     margin-left: -3px;
264     margin-top: -3px;
265     cursor: n-resize;
266 }
267
268 .point-l{
269     left:0%;
270     top: 50%;
271     margin-left: -3px;
272     margin-top: -3px;
273     cursor: n-resize;
274 }
275
276 .point-lt{
277     left:0%;
278     top: 0%;
279     margin-left: -3px;
280     margin-top: -3px;
281     cursor: n-resize;
282 }
283
284 /* 裁剪框预览内容 */
285 .wx-cropper-viewer{
286   position: relative;
287   width: 100%;
288   height: 100%;
289   overflow: hidden;
290 }
291
292 .wx-cropper-viewer image{
293   position: absolute;
294   z-index: 2;
295 }

js

  1 // pages/wx-cropper/index.js
  2 // 手机的宽度
  3 var windowWRPX = 750
  4 // 拖动时候的 pageX
  5 var pageX = 0
  6 // 拖动时候的 pageY
  7 var pageY = 0
  8
  9 var pixelRatio = wx.getSystemInfoSync().pixelRatio
 10
 11 // 调整大小时候的 pageX
 12 var sizeConfPageX = 0
 13 // 调整大小时候的 pageY
 14 var sizeConfPageY = 0
 15
 16 var initDragCutW = 0
 17 var initDragCutL = 0
 18 var initDragCutH = 0
 19 var initDragCutT = 0
 20
 21 // 移动时 手势位移与 实际元素位移的比
 22 var dragScaleP = 2
 23
 24 Page({
 25   /**
 26    * 页面的初始数据
 27    */
 28   data: {
 29     imageNum: ‘‘, //上传的图片id
 30     headImg: ‘‘, //头像上传
 31     ewmImg: ‘‘, //二维码上传
 32     imageFixed: false, //裁剪浮层
 33     // imageSrc: ‘http://topmdrt-static.oss-cn-shenzhen.aliyuncs.com/images/testimg2.jpeg‘,
 34     imageSrc: ‘‘, //要裁剪的图片
 35     returnImage: ‘‘,
 36     isShowImg: false,
 37     // 初始化的宽高
 38     cropperInitW: windowWRPX,
 39     cropperInitH: windowWRPX,
 40     // 动态的宽高
 41     cropperW: windowWRPX,
 42     cropperH: windowWRPX,
 43     // 动态的left top值
 44     cropperL: 0,
 45     cropperT: 0,
 46
 47     // 图片缩放值
 48     scaleP: 0,
 49     imageW: 0,
 50     imageH: 0,
 51
 52     // 裁剪框 宽高
 53     cutW: 400,
 54     cutH: 400,
 55     cutL: 0,
 56     cutT: 0,
 57   },
 58
 59   /**
 60    * 生命周期函数--监听页面加载
 61    */
 62   onReady: function (options) {
 63   },
 64
 65   /**
 66    * 生命周期函数--监听页面初次渲染完成
 67    */
 68   onLoad: function () {
 69     var _this = this
 70
 71     // wx.showLoading({
 72     //   title: ‘图片加载中...‘,
 73     // })
 74
 75     wx.getImageInfo({
 76       src: _this.data.imageSrc,
 77       success: function success(res) {
 78         var innerAspectRadio = res.width / res.height;
 79         console.log(innerAspectRadio)
 80         // 根据图片的宽高显示不同的效果   保证图片可以正常显示
 81         if (innerAspectRadio >= 1) {
 82           _this.setData({
 83             cropperW: windowWRPX,
 84             cropperH: windowWRPX / innerAspectRadio,
 85             // 初始化left right
 86             cropperL: Math.ceil((windowWRPX - windowWRPX) / 2),
 87             cropperT: Math.ceil((windowWRPX - windowWRPX / innerAspectRadio) / 2),
 88             // 裁剪框  宽高
 89             // cutW: windowWRPX - 200,
 90             // cutH: windowWRPX / innerAspectRadio - 200,
 91             cutL: Math.ceil((windowWRPX - windowWRPX + 340) / 2),
 92             cutT: Math.ceil((windowWRPX / innerAspectRadio - (windowWRPX / innerAspectRadio - 20)) / 2),
 93             // 图片缩放值
 94             scaleP: res.width * pixelRatio / windowWRPX,
 95             // 图片原始宽度 rpx
 96             imageW: res.width * pixelRatio,
 97             imageH: res.height * pixelRatio
 98           })
 99         } else {
100           _this.setData({
101             cropperW: windowWRPX * innerAspectRadio,
102             cropperH: windowWRPX,
103             // 初始化left right
104             cropperL: Math.ceil((windowWRPX - windowWRPX * innerAspectRadio) / 2),
105             cropperT: Math.ceil((windowWRPX - windowWRPX) / 2),
106             // 裁剪框的宽高
107             // cutW: windowWRPX * innerAspectRadio - 66,
108             // cutH: 400,
109             cutL: Math.ceil((windowWRPX * innerAspectRadio - (windowWRPX * innerAspectRadio - 20)) / 2),
110             cutT: Math.ceil((windowWRPX - 340) / 2),
111             // 图片缩放值
112             scaleP: res.width * pixelRatio / windowWRPX,
113             // 图片原始宽度 rpx
114             imageW: res.width * pixelRatio,
115             imageH: res.height * pixelRatio
116           })
117         }
118         _this.setData({
119           isShowImg: true
120         })
121         wx.hideLoading()
122       }
123     })
124   },
125
126   // 拖动时候触发的touchStart事件
127   contentStartMove(e) {
128     pageX = e.touches[0].pageX
129     pageY = e.touches[0].pageY
130   },
131
132   // 拖动时候触发的touchMove事件
133   contentMoveing(e) {
134     var _this = this
135     // _this.data.cutL + (e.touches[0].pageX - pageX)
136     // console.log(e.touches[0].pageX)
137     // console.log(e.touches[0].pageX - pageX)
138     var dragLengthX = (pageX - e.touches[0].pageX) * dragScaleP
139     var dragLengthY = (pageY - e.touches[0].pageY) * dragScaleP
140     var minX = Math.max(_this.data.cutL - (dragLengthX), 0)
141     var minY = Math.max(_this.data.cutT - (dragLengthY), 0)
142     var maxX = _this.data.cropperW - _this.data.cutW
143     var maxY = _this.data.cropperH - _this.data.cutH
144     this.setData({
145       cutL: Math.min(maxX, minX),
146       cutT: Math.min(maxY, minY),
147     })
148     console.log(`${maxX} ----- ${minX}`)
149     pageX = e.touches[0].pageX
150     pageY = e.touches[0].pageY
151   },
152
153   // 获取图片
154   getImageInfo() {
155     var _this = this
156     console.log(‘shengcheng:‘ + _this.data.imageSrc)
157     wx.showLoading({
158       title: ‘图片生成中...‘,
159     })
160     // wx.downloadFile({
161     //   url:_this.data.imageSrc, //仅为示例,并非真实的资源
162     //   success: function (res) {
163     // 将图片写入画布
164     const ctx = wx.createCanvasContext(‘myCanvas‘)
165     // ctx.drawImage(res.tempFilePath)
166     ctx.drawImage(_this.data.imageSrc)
167
168     ctx.draw(true, () => {
169       // 获取画布要裁剪的位置和宽度   均为百分比 * 画布中图片的宽度    保证了在微信小程序中裁剪的图片模糊  位置不对的问题
170       var canvasW = (_this.data.cutW / _this.data.cropperW) * (_this.data.imageW / pixelRatio)
171       var canvasH = (_this.data.cutH / _this.data.cropperH) * (_this.data.imageH / pixelRatio)
172       var canvasL = (_this.data.cutL / _this.data.cropperW) * (_this.data.imageW / pixelRatio)
173       var canvasT = (_this.data.cutT / _this.data.cropperH) * (_this.data.imageH / pixelRatio)
174       console.log(`canvasW:${canvasW} --- canvasH: ${canvasH} --- canvasL: ${canvasL} --- canvasT: ${canvasT} -------- _this.data.imageW: ${_this.data.imageW}  ------- _this.data.imageH: ${_this.data.imageH} ---- pixelRatio ${pixelRatio}`)
175       wx.canvasToTempFilePath({
176         x: canvasL,
177         y: canvasT,
178         width: canvasW,
179         height: canvasH,
180         destWidth: canvasW,
181         destHeight: canvasH,
182         canvasId: ‘myCanvas‘,
183         success: function (res) {
184           wx.hideLoading()
185           // 成功获得地址的地方
186           console.log(‘end:‘ + res.tempFilePath)
187           // 判断时上传头像还是二维码
188           _this.setData({
189             imageFixed: false,
190           })
191           if (_this.data.imageNum == ‘1‘) {
192             _this.setData({
193               headImg: res.tempFilePath
194             })
195           } else if (_this.data.imageNum == ‘2‘) {
196             _this.setData({
197               ewmImg: res.tempFilePath
198             })
199           }
200
201         }
202       })
203     })
204     //   }
205
206
207     // })
208   },
209
210   // 设置大小的时候触发的touchStart事件
211   dragStart(e) {
212     var _this = this
213     sizeConfPageX = e.touches[0].pageX
214     sizeConfPageY = e.touches[0].pageY
215     initDragCutW = _this.data.cutW
216     initDragCutL = _this.data.cutL
217     initDragCutT = _this.data.cutT
218     initDragCutH = _this.data.cutH
219   },
220
221   // 设置大小的时候触发的touchMove事件
222   dragMove(e) {
223     var _this = this
224     var dragType = e.target.dataset.drag
225     switch (dragType) {
226       case ‘right‘:
227         var dragLength = (sizeConfPageX - e.touches[0].pageX) * dragScaleP
228         if (initDragCutW >= dragLength) {
229           // 如果 移动小于0 说明是在往下啦  放大裁剪的高度  这样一来 图片的高度  最大 等于 图片的top值加 当前图片的高度  否则就说明超出界限
230           if (dragLength < 0 && _this.data.cropperW > initDragCutL + _this.data.cutW) {
231             this.setData({
232               cutW: initDragCutW - dragLength
233             })
234           }
235           // 如果是移动 大于0  说明在缩小  只需要缩小的距离小于原本裁剪的高度就ok
236           if (dragLength > 0) {
237             this.setData({
238               cutW: initDragCutW - dragLength
239             })
240           }
241           else {
242             return
243           }
244         } else {
245           return
246         }
247         break;
248       case ‘left‘:
249         var dragLength = (dragLength = sizeConfPageX - e.touches[0].pageX) * dragScaleP
250         console.log(dragLength)
251         if (initDragCutW >= dragLength && initDragCutL > dragLength) {
252           if (dragLength < 0 && Math.abs(dragLength) >= initDragCutW) return
253           this.setData({
254             cutL: initDragCutL - dragLength,
255             cutW: initDragCutW + dragLength
256           })
257         } else {
258           return;
259         }
260         break;
261       case ‘top‘:
262         var dragLength = (sizeConfPageY - e.touches[0].pageY) * dragScaleP
263         if (initDragCutH >= dragLength && initDragCutT > dragLength) {
264           if (dragLength < 0 && Math.abs(dragLength) >= initDragCutH) return
265           this.setData({
266             cutT: initDragCutT - dragLength,
267             cutH: initDragCutH + dragLength
268           })
269         } else {
270           return;
271         }
272         break;
273       case ‘bottom‘:
274         var dragLength = (sizeConfPageY - e.touches[0].pageY) * dragScaleP
275         // console.log(_this.data.cropperH > _this.data.cutT + _this.data.cutH)
276         console.log(dragLength)
277         console.log(initDragCutH >= dragLength)
278         console.log(_this.data.cropperH > initDragCutT + _this.data.cutH)
279         // 必须是 dragLength 向上缩小的时候必须小于原本的高度
280         if (initDragCutH >= dragLength) {
281           // 如果 移动小于0 说明是在往下啦  放大裁剪的高度  这样一来 图片的高度  最大 等于 图片的top值加 当前图片的高度  否则就说明超出界限
282           if (dragLength < 0 && _this.data.cropperH > initDragCutT + _this.data.cutH) {
283             this.setData({
284               cutH: initDragCutH - dragLength
285             })
286           }
287           // 如果是移动 大于0  说明在缩小  只需要缩小的距离小于原本裁剪的高度就ok
288           if (dragLength > 0) {
289             this.setData({
290               cutH: initDragCutH - dragLength
291             })
292           }
293           else {
294             return
295           }
296         } else {
297           return
298         }
299         break;
300       case ‘rightBottom‘:
301         var dragLengthX = (sizeConfPageX - e.touches[0].pageX) * dragScaleP
302         var dragLengthY = (sizeConfPageY - e.touches[0].pageY) * dragScaleP
303         if (initDragCutH >= dragLengthY && initDragCutW >= dragLengthX) {
304           // bottom 方向的变化
305           if ((dragLengthY < 0 && _this.data.cropperH > initDragCutT + _this.data.cutH) || (dragLengthY > 0)) {
306             this.setData({
307               cutH: initDragCutH - dragLengthY
308             })
309           }
310
311           // right 方向的变化
312           if ((dragLengthX < 0 && _this.data.cropperW > initDragCutL + _this.data.cutW) || (dragLengthX > 0)) {
313             this.setData({
314               cutW: initDragCutW - dragLengthX
315             })
316           }
317           else {
318             return
319           }
320         } else {
321           return
322         }
323         break;
324       default:
325         break;
326     }
327   },
328   // 图片上传
329   upLoad: function () {
330
331   },
332   upEwm: function (e) {
333     var _this = this
334     wx.chooseImage({
335       count: 1, // 默认9
336       sizeType: [‘original‘, ‘compressed‘], // 可以指定是原图还是压缩图,默认二者都有
337       sourceType: [‘album‘, ‘camera‘], // 可以指定来源是相册还是相机,默认二者都有
338       success: function (res) {
339         // 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
340         var tempFilePaths = res.tempFilePaths;
341         // var mode = parseFloat(e.currentTarget.dataset.current);
342         console.log(‘shangchuan:‘ + tempFilePaths)
343         console.log(e.currentTarget.dataset.which);
344         _this.setData({
345           imageFixed: true,
346           imageSrc: tempFilePaths.join(),
347           imageNum: e.currentTarget.dataset.which
348         })
349         // start
350         wx.getImageInfo({
351           src: _this.data.imageSrc,
352           success: function success(res) {
353             var innerAspectRadio = res.width / res.height;
354             console.log(‘bili‘ + innerAspectRadio)
355             // 根据图片的宽高显示不同的效果   保证图片可以正常显示
356
357
358             if (innerAspectRadio == ‘1‘) {
359               console.log(‘zhengfangxingtu‘)
360               _this.setData({
361                 imageFixed: false,
362               })
363               // 判断时上传头像还是二维码
364               if (_this.data.imageNum == ‘1‘) {
365                 _this.setData({
366                   headImg: tempFilePaths.join()
367                 })
368               } else if (_this.data.imageNum == ‘2‘) {
369                 _this.setData({
370                   ewmImg: tempFilePaths.join()
371                 })
372               }
373
374             } else if (innerAspectRadio > 1) {
375               _this.setData({
376                 cropperW: windowWRPX,
377                 cropperH: windowWRPX / innerAspectRadio,
378                 // 初始化left right
379                 cropperL: Math.ceil((windowWRPX - windowWRPX) / 2),
380                 cropperT: Math.ceil((windowWRPX - windowWRPX / innerAspectRadio) / 2),
381                 // 裁剪框  宽高
382                 // cutW: windowWRPX - 200,
383                 // cutH: windowWRPX / innerAspectRadio - 200,
384                 cutL: Math.ceil((windowWRPX - windowWRPX + 340) / 2),
385                 cutT: Math.ceil((windowWRPX / innerAspectRadio - (windowWRPX / innerAspectRadio - 20)) / 2),
386                 // 图片缩放值
387                 scaleP: res.width * pixelRatio / windowWRPX,
388                 // 图片原始宽度 rpx
389                 imageW: res.width * pixelRatio,
390                 imageH: res.height * pixelRatio
391               })
392             } else {
393               _this.setData({
394                 cropperW: windowWRPX * innerAspectRadio,
395                 cropperH: windowWRPX,
396                 // 初始化left right
397                 cropperL: Math.ceil((windowWRPX - windowWRPX * innerAspectRadio) / 2),
398                 cropperT: Math.ceil((windowWRPX - windowWRPX) / 2),
399                 // 裁剪框的宽高
400                 // cutW: windowWRPX * innerAspectRadio - 66,
401                 // cutH: 400,
402                 cutL: Math.ceil((windowWRPX * innerAspectRadio - (windowWRPX * innerAspectRadio - 20)) / 2),
403                 cutT: Math.ceil((windowWRPX - 340) / 2),
404                 // 图片缩放值
405                 scaleP: res.width * pixelRatio / windowWRPX,
406                 // 图片原始宽度 rpx
407                 imageW: res.width * pixelRatio,
408                 imageH: res.height * pixelRatio
409               })
410             }
411             _this.setData({
412               isShowImg: true
413             })
414             wx.hideLoading()
415           }
416         })
417
418         // end
419       }
420     })
421   },
422   /**
423    * 生命周期函数--监听页面显示
424    */
425   onShow: function () {
426
427   },
428
429   /**
430    * 生命周期函数--监听页面隐藏
431    */
432   onHide: function () {
433
434   },
435
436   /**
437    * 生命周期函数--监听页面卸载
438    */
439   onUnload: function () {
440
441   },
442
443   /**
444    * 页面相关事件处理函数--监听用户下拉动作
445    */
446   onPullDownRefresh: function () {
447
448   },
449
450   /**
451    * 页面上拉触底事件的处理函数
452    */
453   onReachBottom: function () {
454
455   },
456
457   /**
458    * 用户点击右上角分享
459    */
460   onShareAppMessage: function () {
461
462   }
463 })

原文地址

原文地址:https://www.cnblogs.com/wush-1215/p/9510936.html

时间: 2024-10-12 08:28:09

小程序_图片剪切功能(支持多图片上传)的相关文章

用Canvas+Javascript FileAPI 实现一个跨平台的图片剪切、滤镜处理、上传下载工具(转)

直接上代码,其中上传功能需要自己配置允许跨域的文件服务器地址~ 或者将html文件贴到您的站点下同源上传也OK. 支持: 不同尺寸图片获取. 原图缩小放大. 原图移动. 选择框大小改变. 下载选中的区域. 上传选中的区域. 几种简单的滤镜(自己添加滤镜函数即可添加滤镜效果) 移动端适配要点: ① 替换事件名称 if(/^.*(Android|iPad|iPhone){1}.*$/.test(navigator.userAgent)){ eventName={down:"touchstart&qu

用Canvas+Javascript FileAPI 实现一个图片剪切、滤镜处理、上传下载工具

直接上代码,其中上传功能需要自己配置允许跨域的文件服务器地址~ 或者将html文件贴到您的站点下同源上传也OK. 支持: 不同尺寸图片获取. 原图缩小放大. 原图移动. 选择框大小改变. 下载选中的区域. 上传选中的区域. 几种简单的滤镜(自己添加滤镜函数即可添加滤镜效果) <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dt

微信小程序_基础组件大全

微信小程序_基础组件 微信小程序为小程序开发者提供了一系列小程序基础组件,开发者可以通过组合这些小程序基础组件进行微信小程序的快速开发. 微信小程序组件是什么?微信小程序组件怎么用? 小程序组件是视图层的基本组成单元.小程序组件自带一些功能与微信风格的样式.一个小程序组件通常包括开始标签和结束标签,属性用来修饰这个组件,内容在两个标签之内. <tagname property="value"> Content goes here ... </tagename>

【转】微信小程序实现微信支付功能(可用)

原博: https://blog.csdn.net/fredrik/article/details/79697963 微信小程序实现微信支付功能 直接把里面的参数替换成你的就可以了,前提是你要开通的有微信支付功能,需要商户号,appid,appsecret,openid, //小程序端代码: pay:function(){ var that=this wx.getStorage({ key: 'openid', success: function(res) { wx.request({ //这里

微信小程序_小程序开发框架

微信小程序_小程序开发框架 微信小程序小程序开发框架的目标是通过尽可能简单.高效的方式让开发者可以在微信中开发具有原生APP体验的服务. 框架提供了自己的视图层描述语言WXML和WXSS,以及基于JavaScript的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统,可以让开发者可以方便的聚焦于数据与逻辑上. 响应的数据绑定微信小程序框架的核心是一个响应的数据绑定系统. 整个系统分为两块视图层(View)和逻辑层(App Service) 框架可以让数据与视图非常简单地保持同步.当做数据

开通小程序的客服功能

开启自定义的小程序的客服功能,需要两步,一步是在自己的微信平台开通消息推送的功能.第二步是完成自己的后台. 第一步:开启推送功能: 具体的在官方wiki里有,可以点这里. 有几个坑需要注意一下,如果你的token验证总是失败: 1.建议你看一下自己server服务器的token与现在的token是否相同. 2.如果你发现自己的代码绝对没有问题,token也绝对没有问题的话,而且还是报错,那么我建议检查一下自己服务器的文件的权限问题了,如果你是tp框架,检查一下啊自己的runtime是否给了777

微信小程序后台持续定位功能使用

微信小程序团队在7月30日更新了 基础库 2.8.0 其中新添加了小程序后台持续定位功能和联系定位的接口 从上到下分别是 1.wx.onLocationChange//监听位置实时变化 2.wx.stopLocationUpdate//关闭监听实时位置变化,前后台都停止消息接收 3.wx.startLocationUpdate//开启小程序进入前台时接收位置消息 4.wx.startLocationUpdataBackground//开启小程序进入前后台时均接收位置消息 详细信息可查看https

PHP 图片上传工具类(支持多文件上传)

====================ImageUploadTool======================== <?php class ImageUploadTool { private $file; //文件信息 private $fileList; //文件列表 private $inputName; //标签名称 private $uploadPath; //上传路径 private $fileMaxSize; //最大尺寸 private $uploadFiles; //上传文件

【黑马程序员】第12课:文件上传&文件下载&注解

<pre> day12 上节内容回顾 1.jstl的标签 *if  choose *forEach <c:forEachvar="l" items="${list}"> 2.jsp开发模式 *模型一 *模型二(mvc模式) **mvc模式 ***m:模型,使用javabean ***v:视图,使用jsp ***c:控制器,使用servlet *dao模式:数据访问对象,专注于对数据库的操作 **首先创建接口,在接口里面定义操作数据库的方法 *

web大文件上传解决方案支持分片断点上传

一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输.关闭浏览器后保留进度信息. 支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务器端文件夹层级结构与本地相同. 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验:支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构. 支持断点续传,关闭浏览器或刷新浏览