【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
扫码二维码
获取最新动态
