示例图:
1:在小程序可见页面减少一个图片展现区域,并给定一个点击事件能够唤起拍照

2:容许小程序应用相机权限后进入拍照页面(页面减少了一个头像搁置区域,返回按钮,拍摄按钮,摄像头转换按钮)

3:点击拍照按钮拍照

4:拍照后进入照片预览页面(页面提供返回重拍和裁剪后预览确认性能,如图红框区域为截图区域,可依照需要自行区域裁剪)

5:裁剪后进入图片预览,并将图片转换成base64格局,与后端接口进行对接

文件代码

centre:示例图1
carame:示例图2,3,4
preview:示例图5
we-cropper:提供示例图4的缩放和剪裁性能(动态资源文件,下载后间接放到pages文件夹下,在carema.js中引入即可,官网下载可点击)

代码摘要
示例图1:按钮触发后,进入carema页面
示例图2:

<view class="caream-wrap">  <camera device-position="{{cameraPos}}" class="carema-area" wx:if="{{showCamera}}">    <camera-view class="carema-anchor">      <image mode="widthFix" class="carema-anchor-img" src="/images/anchor.png"></image>    </camera-view>  </camera>  <view class="CameraOptions" wx:if="{{showCamera}}">    <view class="takePicBtn">      <!-- 摄像头的返回按钮 -->      <view class="takephotoicon">        <image mode="widthFix" class="confirm" src="/images/caremaback.png" bindtap="goBack"></image>      </view>      <!-- 照相的按钮 -->      <view bindtap="getPhoto" class="takephotoicon">        <view class="outter-shoot">          <view class="inner-shoot"></view>        </view>      </view>      <!-- 摄像头的前后转换按钮 -->      <view class="takephotoicon">        <image mode="widthFix" class="switch" src="/images/switch.png" bindtap='changePos'></image>      </view>    </view>  </view><!--剪裁区域-->  <import src="../we-cropper/we-cropper.wxml" />  <view class="cropper-wrapper" wx:if="{{!showCamera}}">    <template is="we-cropper" data="{{...cropperOpt}}" />  </view>  <view class="cropper-buttons" wx:if="{{!showCamera}}">    <view class="cancel" bindtap="handleCloseCropper">重拍</view>    <view class="getCropperImage" bindtap="getCropperImage">确定并预览</view>  </view></view>

js

import WeCropper from '../we-cropper/we-cropper.js'const device = wx.getSystemInfoSync(); // 获取设施信息const width = device.windowWidth; // 获取设施宽,不便设置画布和裁剪框宽度const height = device.windowHeight; // 获取设施高,不便设置画布和裁剪框高度Page({  data: {    cropperOpt: {      id: 'cropper', // 用于手势操作的canvas组件标识符      targetId: 'targetCropper', // 用于用于生成截图的canvas组件标识符      pixelRatio: device.pixelRatio, // 传入设施像素比      width, // 画布宽度      height: 413, // 画布高度      scale: 2.5, // 最大缩放倍数      zoom: 8, // 缩放系数      src: "",      cut: {        x: (width - 295) / 2, // 裁剪框x轴终点        y: 0, // 裁剪框y轴期终点        width: 295, // 裁剪框宽度        height: 413 // 裁剪框高度      }    },    imageUrl: "",    cameraPos: 'front',    showCamera: true,    wecropper: ''  },  // 照相  getPhoto() {    // c创立相机上下文对象,获取惟一的相机对象    var context = wx.createCameraContext()    // 照相性能    context.takePhoto({      quality: "low",      success: res => {        // 照相胜利的回调        console.log(res); // 图片的信息        this.setData({          // 暗藏相机          showCamera: false,          imageUrl: res.tempImagePath,          src: res.tempImagePath,        })        // 实例化WeCropper        this.createCropper();      },      fail: () => {        wx.showToast({          title: '呈现谬误',        })      }    })  },  createCropper() {    const that = this    let {      cropperOpt    } = that.data    cropperOpt.src = that.data.imageUrl;    let wecropper = new WeCropper(cropperOpt).on('ready', (ctx) => {}).on('beforeImageLoad', (ctx) => {    }).on('imageLoad', (ctx) => {})    this.setData({      wecropper,    })  },  // 相机前后镜头转换  changePos() {    this.setData({      cameraPos: this.data.cameraPos == "back" ? "front" : "back"    })  },  // 敞开相机,回退到个集体核心  goBack() {    wx.switchTab({      url: '../centre/centre',    })  },  //点击勾销裁剪  handleCloseCropper() {    console.log(11111)    this.setData({      showCamera: true    });  },  touchStart(e) {    this.wecropper.touchStart(e)  },  touchMove(e) {    this.wecropper.touchMove(e)  },  touchEnd(e) {    this.wecropper.touchEnd(e)  },  getCropperImage() {    wx.setStorageSync('caremapreview', null);    this.data.wecropper.getCropperImage((tempFilePath) => {      console.log(tempFilePath)      // tempFilePath 为裁剪后的图片长期门路      if (tempFilePath) {        this.setData({          // 暗藏相机          imageUrl: tempFilePath        })        wx.getImageInfo({          src: tempFilePath,          success(imageInfo) {            let imgType = imageInfo.type            wx.getFileSystemManager().readFile({              filePath: tempFilePath,              encoding: "base64",              success: res => {                //返回base64格局                let base64Str = 'data:image/' + imgType + ';base64,' + res.data                wx.setStorageSync('caremapreview', {                  imgurl: base64Str,                });                wx.navigateTo({                  url: '../preview/preview',                })              },              fail: err => {                console.log(err)              }            })          }        })      } else {        wx.showModal({          title: '获取图片地址失败,请稍后重试',          icon: 'success'        })      }    })  },})

外围办法阐明
getCropperImage()实现了剪裁图片长期地址的额获取,并且在取得地址后应用微信自带的wx.getFileSystemManager().readFile()办法实现了将temp地址转换成base64格局。base64暂存入StorageSync,便于preview页面获取base64地址并展现

如有问题,请斧正,心愿能帮到大家