uniApp图片非透明背景转透明背景(vue中原理相同)

4,423 阅读1分钟

实现思路

H5这边想实现这个功能的话主要还是得靠canvas,利用canvas相关的api实现对图片的RGBA通道的透明度修改从而达到图片背景的透明的效果,使用场景多见于印章提取等应用场景。

效果

微信截图_20211119131800.png

微信截图_20211119131814.png

第一步:标签样式部分

canvas标签在uni中是有默认宽高的,如果有需要就手动设置宽高

<canvas id="mCanvas" canvas-id="mCanvas" class="mCanvasClass"></canvas>

.mCanvasClass {
    width: 100px;
    height: 100px;
}

第二步:获取Canvas上下文环境

首先data中定义相关变量,并在onReady中获取。

data() {
    return {
        mCanvas:{},
    }
}
   
  onReady() {
      this.mCanvas = uni.createCanvasContext('mCanvas')
}

第三步:通过canvas提供的api进行图像处理并导出

start() {
  let _this = this
  let canvasName = 'mCanvas'
  let w = 200
  let h = 200
  //提取图像RGBA通道颜色值,每连续四个为一个像素点,分别代表RGBA
  uni.canvasGetImageData({
    canvasId: canvasName,
    x: 0,
    y: 0,
    width: w,
    height: h,
    success(res) {
      let pxData = res.data
      let yz = 150
      for (let i = 0; i < pxData.length; i += 4) {
        if (
            pxData[i] > yz &&
            pxData[i + 1] > yz &&
            pxData[i + 2] > yz
        ) {
          pxData[i] = 255;
          pxData[i + 1] = 255;
          pxData[i + 2] = 255;
          pxData[i + 3] = 0;
        }
      }
      //先清空画布后再并绘制,否则使用同一个画布会导致重复绘制 
      _this.mCanvas.clearRect(0, 0, w, h)
      _this.mCanvas.draw()
      //把处理好的像素点放回到画布中
      uni.canvasPutImageData({
        canvasId: canvasName,
        x: 0,
        y: 0,
        width: w,
        height: h,
        data: pxData,
        success(res) {
          // 如需要提取请执行以下方法
          uni.canvasToTempFilePath({
            x: 0,
            y: 0,
            width: w,
            height: h,
            destWidth: w,
            destHeight: h,
            canvasId: canvasName,
            success: (res) => {
              //可以利用此base64
              let url = _this.parseBlob(res.tempFilePath)
              console.log(url)
              //可以利用此url上传至服务器
            }
          })
        },
        fail(res) {
        }
      })
    }
  })
}