小程序图片选择区域/等屏裁剪实现方法

效果图

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

 现在IOS还有个坑就是裁剪不了,官方正在修复不知道什么时候好 目前时间2017-12-02

时间: 2024-11-17 19:55:14

小程序图片选择区域/等屏裁剪实现方法的相关文章

小程序---&gt;小程序图片上传阿里OSS使用方法

小程序图片上传阿里OSS使用方法 首先看下参考文档 ( http://blog.csdn.net/qq_38125123/article/details/73870667) 这里只将一些运用过程中遇到的问题及解决办法: 1.cryptojs,sha1js,hmacjs,base64js在哪下载及使用方法: 文件可以在阿里oss实例文档中找到. 在运用过程中如果是通过require引入的,会找不到引入的方法,原因是这些js文档没有模块导出,可以在原文件里找到其顶部全局对象,exports出来即可.

微信小程序--图片相关问题合辑

图片上传相关文章 微信小程序多张图片上传功能 微信小程序开发(二)图片上传 微信小程序上传一或多张图片 微信小程序实现选择图片九宫格带预览 ETL:微信小程序之图片上传 微信小程序wx.previewImage预览图片 微信小程序之预览图片 小程序开发:上传图片到腾讯云 .NET开发微信小程序-上传图片到服务器 微信小程序本地图片处理--按屏幕尺寸插入图片 [微信小程序]上传图片到阿里云OSS Python Flask小程序文件(图片)上传技巧 小程序图片上传阿里OSS使用方法 微信小程序问题汇

关于微信小程序图片自适应的部分做法

关于微信小程序图片自适应的做法 在日常业务场景中,很多地方都需要图片进行列表的显示,但是这样就存在一个问题,由于每张上传的图片规格并不是一样的,就会发生图片要么过大,要么过小,或者被拉伸的情况,如下图 对于这个情况,我的思路是可以使用image标签内的bindload属性进行计算,bindload属性的介绍如下 下面就是具体的方法流程 1.首先我们在页面上进行布局,只需要给image标签的view容器添加宽高即可,并使用wx:for进行遍历渲染,通过自定义属性data-i传入索引值,容器我同时也

微信小程序-图片、录音、音频播放、音乐播放、视屏、文件

图片: wx.chooseImage(OBJECT) 从本地相册选择图片或使用相机拍照. OBJECT参数说明: 注:文件的临时路径,在小程序本次启动期间可以正常使用,如需持久保存,需在主动调用 wx.saveFile,在小程序下次启动时才能访问得到. 示例代码: wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourceType: ['album',

小程序图片上传

问题: 描述:小程序中的wx.chooseImage(OBJECT)选择相册或者相机的照片,虽然有图片的url返回,但是那个是临时路径,不知道怎么上传到公司的服务器中. 结果方案: 后面我查看到了,找到了对应的方法,wx.uploadFile(OBJECT). 小程序代码 wx.chooseImage({ success: function(res) { var tempFilePaths = res.tempFilePaths wx.uploadFile({ url: 'http://exam

小程序图片失真解决办法

解决办法: 一: 此办法不仅仅是针对小程序,适用于支持CSS3属性的浏览器. 将图片设置为配景图片.img { background:url('') no-repeat; background-size:cover //此属性是是把背景扩充到足够大,使背景图像完全覆盖背景区域.背景图像的某些部分也许永远无法显示在背景定位区域中 } 二: <image src=""></image>图片失真 以Iphone的宽度和高度为基准,将原图片的宽度和高度扩大2倍,单位写成

微信小程序图片变形解决方法

微信小程序的image标签中有个mode属性,使用aspectFill即可 注:image组件默认宽度300px.高度225px mode 有效值: mode 有 13 种模式,其中 4 种是缩放模式,9 种是裁剪模式.

玩转小程序图片功能

背景 最近经常接触小程序,图片功能还是比较重要的,于是自己小小总结了一番,希望对大家有帮助. 图片上传 应用场景:个人页的头像,提交资料的图像文件等 我认为一个正确的图片上传流程: 客户端上传图片 预览 提交到服务器保存 所以,对于小程序这个流程就很方便了,只需要用到三个方法: wx.chooseImage wx.previewImage(通过图片直接显示,可不需要) wx.uploadFile 以下简略用几个按钮模拟这个过程,先上代码: testimg.wxml <view class="

小程序---图片加载出错时,显示默认图片

在读取类似新闻列表等功能时,一般都会有图片,有时会因为数据问题,图片会加载不出来,此时,为了更好的用户体验, 我们应当在图片数据出错时,用默认的图片代替它. html5有对应的img事件:onerror 下面是小程序里的一个demo,事件是binderror: <block wx:for="{{list}}"> <image class='news-img' src="{{item.imgSrc}}" binderror='imageError'