首页/新闻资讯/正文
微信小程序图片选择区域屏裁剪实现方法及相关问题介绍

 2025年06月20日  阅读 2

摘要:【HTML代码实现】微信小程序中,要实现图片区域的裁剪功能,首先需要在HTML部分构建起基本框架。这涉及到建立一个包含图片展示区域、操作按钮以及裁剪框的布局。其中,关键组成部分有:一是用于展示原始图片的image元素;二是位于顶部的两个操作按钮,分别用于矩形...

【HTML代码实现】

微信小程序中,要实现图片区域的裁剪功能,首先需要在HTML部分构建起基本框架。这涉及到建立一个包含图片展示区域、操作按钮以及裁剪框的布局。其中,关键组成部分有:一是用于展示原始图片的image元素;二是位于顶部的两个操作按钮,分别用于矩形和圆形裁剪;三是位于底部的确认和重置按钮;四是覆盖在图片上的半透明遮罩层以及可以随意拖动的裁剪框。请确保为各个元素正确分配class和数据属性,这样做将有助于后续的操作进行。

【CSS样式设计】

关键设计要素涵盖:首先,将图片的容器定位设置为相对;其次,裁剪区域通过绝对定位呈现,并附上红色边框以作标记;再者,顶部按钮群组以flex布局方式展开;此外,遮罩层通过rgba色彩模式实现半透明效果,并通过z-index属性来调整其显示层级;最后,针对不同的裁剪模式(如矩形或圆形),预先定义相应的样式类别,并在圆形裁剪时将border-radius属性设置为50%。特别注意要禁用图片的默认长按菜单,避免与裁剪操作冲突。


 
 开始裁剪
 点击上传图片
 点击确认
 
 
 
 
  等屏裁剪
 
 
  区域裁剪
 
 
 
 
 
 
 
  
 
 重新裁剪
 
 
 
 
 
 
 

【JS核心逻辑】

在初始化环节,需运用wx.chooseImage功能挑选图片,同时加载前一个页面传递的路径参数。为实现裁剪框的拖动,需创建并设置touchStart、touchMove、touchEnd事件监听器:首先,记录初始触摸点位置;其次,根据移动距离调整裁剪框的坐标;最后,进行边界检测,以避免裁剪框越出图片边界。在处理等比例缩放的要求时,必须同步进行高度值的计算与更新,同时滑动选择操作需与之配合。务必保留原始图片的尺寸数据,以便在最终裁剪阶段进行坐标的转换。

.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;
}

【裁剪功能实现】

在点击确认按键之后,首先需要获取裁剪框与图片之间的具体位置与大小尺寸;接着,运用canvas技术对指定的区域进行绘制,并通过wx.canvasToTempFilePath方法导出所得的图片;最后,将新生成的图片路径传递回上一级页面。若要进行圆形裁剪,必须先描绘出圆形的路径,然后应用clip裁剪功能。目前,iOS系统中的限制性问题可以通过调用wx.getSystemInfo接口来识别平台,对此,我们暂时向用户发出提示信息,或者采取备选方案来应对。

【异常处理】

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'
  //获取当前屏幕宽度   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     })    }   })  },

需解决以下常见问题:首先,当图片加载失败时,应展示错误信息提示;其次,若裁剪框尺寸偏小,应禁止用户执行确认操作;再者,重置功能应当清除所有操作记录;最后,在内存不足的情况下,需释放canvas资源。此外,特别需关注Android与iOS之间的差异,比如在部分iOS版本中,裁剪结果可能会出现偏移,因此建议增加10至20像素的额外边距以作补偿。

【性能优化建议】

// 点击确认裁剪图片
 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
    })
   } 
  })
 },

处理大图片时,需注意以下几点:首先,应设定一个合理的最大尺寸限制;其次,应用wx.compressImage功能对原始文件进行压缩;再者,裁剪操作应分阶段进行,以防止界面出现卡顿现象。此外,为了提升用户体验,可以添加加载动画;对于频繁的裁剪操作,建议缓存中间结果。在官方解决iOS相关问题时,可以先指导用户将图片保存至相册,然后使用系统提供的编辑工具进行后续处理。

【完整代码示例】

请提供完整的HTML、CSS以及JavaScript代码,由于篇幅原因,具体内容在此省略。其中关键点涵盖:为图片选择绑定事件、编写触摸事件处理程序、实现canvas裁剪的算法、以及处理回调结果。建议将裁剪功能设计为一个独立的模块,通过属性接收配置信息,利用事件触发回调,以便于在多个地方进行复用。

// 点击红框开始移动
 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()
 },

该方案在众多Android设备上已成功通过测试,一旦iOS官方推出修复更新,应及时对其实现方式进行同步的调整。在开发过程中,推荐使用真实的设备调试工具,实时监测触摸点的坐标以及元素的尺寸,这对于精准定位裁剪范围显得尤为关键。

//等屏裁剪
 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
  })
 },

版权声明:本文为 “博览广文网” 原创文章,转载请附上原文出处链接及本声明;

原文链接:http://wen.bjhwtx.com/post/33691.html

标签:

博览广文网

博览广文网为所有文学爱好者、新闻爱好者、关注生活多方面内容的观众朋友提供多方位的内容呈现、提升阅读空间、填充碎片时间,开阔读者的视野、增长见识、了解民生、一个让您不出户尽知天下事的网站平台!
热门标签
关于我们
广文舒阅网—让天下读者有家可归!这里汇聚了各类优质文化信息,无论是全球热点、历史故事,还是实用百科、趣味探索,您都能轻松获取。我们希望用阅读点亮您的世界,让每一次浏览都充满收获和乐趣。
导航栏A标题
广文舒阅网
扫码关注
联系方式
全国服务热线:0755-88186625
Q Q:8705332
Email:admin@lanyu.com
地址:深圳市福田区海雅缤纷国际大厦5层501
Copyright 深圳市蓝宇科技有限公司 版权所有 备案号:京ICP备20013102号-1