温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么实现小程序图片选择区域裁剪

发布时间:2020-12-22 10:14:46 来源:亿速云 阅读:161 作者:小新 栏目:移动开发

这篇文章给大家分享的是有关怎么实现小程序图片选择区域裁剪的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

具体如下:

效果图

怎么实现小程序图片选择区域裁剪

怎么实现小程序图片选择区域裁剪

怎么实现小程序图片选择区域裁剪

HTML代码

<view class="index_all_box">  <view class="imgCut_header">  <view class="imgCut_header_l" bindtap='okCutImg'>开始裁剪</view>  <view class="imgCut_header_m" bindtap='clickUpImg'>点击上传图片</view>  <view class="imgCut_header_r" bindtap='okBtn'>点击确认</view>  </view>  <!-- 选择裁剪模式 -->  <view class="selectCutMode" wx:if='{{alreay}}'>  <view class="selectCutMode_in {{cutType?'selectCutMode_in_act':''}}" bindtap='etcType'>   等屏裁剪  </view>  <view class="selectCutMode_in {{!cutType?'selectCutMode_in_act':''}}" bindtap='areaType'>   区域裁剪  </view>  </view>  <view class="areaSelct_box" wx:if='{{!cutType && alreay}}'>  <slider bindchange="areaChange" min="50" max="100" show-value value='{{propor}}'/>  </view>  <view class="cutImg_box" wx:if='{{!prienFlag}}'>  <view class="cutImg_box_t">   <image src="{{cutImgUrl}}" mode='widthFix'></image>  </view>  <view class="clickCutImg_txt" bindtap='againBtn'>重新裁剪</view>  </view>  <view class="allCavans" wx:if='{{prienFlag}}' style='width: {{canvasW}}px;height: {{canvasH}}px' >  <canvas class='canvasSty' style='width: {{canvasW}}px;height: {{canvasH}}px' canvas-id='cutImg' disable-scroll='true' bindtouchmove='canvasMove'></canvas>  <view class="allCavans_inbg" style='width: {{canvasW}}px;height:{{canvasH}}px; background: url({{img}});background-size: 100% 100%'></view>  </view>     </view>

CSS代码

.imgCut_header{  padding: 30rpx;  display: flex;  justify-content: space-between;  align-items: center;  background: #000;  color: #fff;  font-size: 24rpx; } .allCavans{  margin: 20rpx auto;  position: relative; } .canvasSty{  position: absolute; } .cutImg_box{  width: 100%;    border-bottom: 2rpx #f98700 solid;  padding-bottom: 20rpx; } .cutImg_box .cutImg_box_t{  width: 90%;  margin: 20rpx auto; } .cutImg_box image{  width: 100%; } .cutImg_box .cutImg_box_b{  margin-top: 20rpx;  width: 80%;  height: 80rpx;  line-height: 80rpx;  background: #f98700;  color: #fff;  border-radius: 10rpx;  text-align: center;  margin:0rpx auto; } .selectCutMode{  background: #fff;  display: flex;  justify-content: space-between;  align-items: center; } .selectCutMode .selectCutMode_in{  width: 100%;  text-align: center;  background: #fff;  color: #f98700;  font-size: 24rpx;  padding: 20rpx; } .selectCutMode .selectCutMode_in_act{  background: #f98700;  color: #fff;  padding: 20rpx; } .areaSelct_box{  width: 100%;  display: flex;  align-items: center;  height: 50rpx;  justify-content: center;  margin-top: 20rpx; } .areaSelct_box slider{  width: 80%; } .cutImg_box .clickCutImg_txt{  width: 100%;  text-align: center;  height: 50rpx;  font-size: 24rpx;  line-height: 50rpx;  color: #999; }

JS代码部分

初始加载带入上一个页面带过来的参数路径

onLoad: function (options) {   var that = this;   const ctx = wx.createCanvasContext('cutImg');   ctx.setGlobalAlpha(0.4)   var aa = 'https://pintuanqu.oss-cn-hangzhou.aliyuncs.com/Uploads/Picture/goodsShow/20171201/5a2125fc86566.png'<br />  //获取当前屏幕宽度   var phoneW = Number(util.nowPhoneWH()[0]*90)/100;   var cutH = 150;   wx.getImageInfo({    src: aa,    success: function (res) {     var w = phoneW;     var h = (phoneW/Number(res.width))*Number(res.height)     ctx.save()      ctx.drawImage(aa, 0, 0, w, h)     ctx.restore()     ctx.setFillStyle('red')     ctx.fillRect(0, 0, phoneW, cutH)     ctx.draw()     that.setData({      canvasW:w,      canvasH:h,      img:aa,      cutH:cutH     })    }   })  },

确定选择区域开始裁剪

// 点击确认裁剪图片  okCutImg:function(){   var that = this;   var canvasW = that.data.canvasW;   var canvasH = that.data.canvasH;   var nowCutW = that.data.cutType?canvasW:that.data.nowCutW;   var nowCutH = that.data.cutType?that.data.cutH:that.data.nowCutH;   var cutX = that.data.cutX;   var cutY = that.data.cutY;   const ctx = wx.createCanvasContext('cutImg');   ctx.setGlobalAlpha(1)   ctx.drawImage(that.data.img, 0, 0, canvasW, canvasH)   ctx.draw()   wx.canvasToTempFilePath({    x: cutX,    y: cutY,    width: nowCutW,    height: nowCutH,    destWidth: nowCutW,    destHeight: nowCutH,    canvasId: 'cutImg',    success: function(res) {     var aa = res.tempFilePath     that.setData({      cutImgUrl:aa,      prienFlag:false,      alreay:false     })    }    })  },

红框根据手指移动方法

// 点击红框开始移动  canvasMove:function(e){   var that = this;   var canvasW = that.data.canvasW;   var canvasH = that.data.canvasH;   var nowCutW = that.data.cutType?canvasW:that.data.nowCutW;   var nowCutH = that.data.cutType?that.data.cutH:that.data.nowCutH   var touches = e.touches[0];     var x = touches.x;   var y = touches.y-(Number(nowCutH)/2);   that.data.cutType?x=0:x=x-(Number(nowCutW)/2);   that.setData({    cutX:x,    cutY:y   })   const ctx = wx.createCanvasContext('cutImg');   ctx.setGlobalAlpha(0.4)   ctx.drawImage(that.data.img, 0, 0, canvasW, canvasH)   ctx.setFillStyle('red')   ctx.fillRect(x, y, nowCutW, nowCutH)   ctx.draw()  },

上方两个选择裁剪方式的按钮

等屏裁剪

//等屏裁剪  etcType:function(){   var that = this;   var propor = 100;   var canvasW = that.data.canvasW;   var canvasH = that.data.canvasH;   var cutH = that.data.cutH;   var nowCutW = (Number(canvasW)*propor)/100   var nowCutH = (Number(cutH)*propor)/100   const ctx = wx.createCanvasContext('cutImg');   ctx.setGlobalAlpha(0.4)   ctx.drawImage(that.data.img, 0, 0, canvasW, canvasH)   ctx.setFillStyle('red')   ctx.fillRect(0, 0, nowCutW, nowCutH)   ctx.draw()   that.setData({    nowCutW:nowCutW,    nowCutH:nowCutH,    cutType:true   })  },

局域裁剪

areaType:function(){   var that = this;   var propor = that.data.propor;   var canvasW = that.data.canvasW;   var canvasH = that.data.canvasH;   var cutH = that.data.cutH;   var nowCutW = (Number(canvasW)*propor)/100   var nowCutH = (Number(cutH)*propor)/100   const ctx = wx.createCanvasContext('cutImg');   ctx.setGlobalAlpha(0.4)   ctx.drawImage(that.data.img, 0, 0, canvasW, canvasH)   ctx.setFillStyle('red')   ctx.fillRect(0,0, nowCutW, nowCutH)   ctx.draw()   that.setData({    nowCutW:nowCutW,    nowCutH:nowCutH,    cutType:false   })  },

局域裁剪上方的滑动选择红框根据宽度等比例缩放

areaChange:function(e){   var that = this;   var propor = e.detail.value;   var canvasW = that.data.canvasW;   var canvasH = that.data.canvasH;   var cutH = that.data.cutH;   var nowCutW = (Number(canvasW)*propor)/100   var nowCutH = (Number(cutH)*propor)/100   const ctx = wx.createCanvasContext('cutImg');   ctx.setGlobalAlpha(0.4)   ctx.drawImage(that.data.img, 0, 0, canvasW, canvasH)   ctx.setFillStyle('red')   ctx.fillRect(that.data.cutX||0, that.data.cutY||0,nowCutW, nowCutH)   ctx.draw()   that.setData({    nowCutW:nowCutW,    nowCutH:nowCutH,    propor:propor   })  },

重新裁剪回到初始选择图片的页面

// 重新裁剪  againBtn:function(){   var that = this;   var data = that.data   this.setData({    prienFlag:true,    alreay:true   })   const ctx = wx.createCanvasContext('cutImg');   ctx.setGlobalAlpha(0.4)   ctx.drawImage(data.img, 0, 0, data.canvasW, data.canvasH)   ctx.setFillStyle('red')   ctx.fillRect(that.data.cutX||0, that.data.cutY||0, data.nowCutW||data.canvasW, data.nowCutH||data.cutH)   ctx.draw()  },

感谢各位的阅读!关于怎么实现小程序图片选择区域裁剪就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI