【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 }) },
版权声明:本文为 “博览广文网” 原创文章,转载请附上原文出处链接及本声明;
工作时间:8:00-18:00
客服电话
0755-88186625
电子邮件
admin@lanyu.com
扫码二维码
获取最新动态