uniapp canvas旋转

4,035 阅读1分钟

最近在做的小程序里需要用电子签名,但是生成的图片方向是竖着的,PC端用这个签名的话就会出现一大片空白。所以就有了接下来的总结。

 原来的图片是这个样子的:

微信图片_20211202142728.png

先说一下思路:

先要保证电子签名组件的正常使用(因为我实在是懒得改),所以我们就在电子签名组件生成的临时图片路径上下手。

我打算把生成的临时图片路径在重新绘制一个canvas假设原来的画布宽200长400,那么新的画布的长就是原来画布的宽,宽就是原来画布的长,这样就相当于把画布翻转了。


  <canvas canvas-id="camCacnvs" :style="{width:height +'px',height:width +'px'}"  class="canvsborder"></canvas>

那么还有一个问题就是新的canvas放在哪里,新的画布我们仅用于操作图片不需要展示出来,那就用绝对而定位让他跑到屏幕外边吧。

.canvsborder{

  border: 1rpx solid #333;

  position: fixed;

  top: 0;

  left: 10000rpx;

}

接下来就是把临时图片路径旋转九十度了。

const that =this

const ctx = uni.createCanvasContext('camCacnvs',this);

    ctx.translate(0, this.width);

    ctx.rotate(-90 * Math.PI / 180)

    ctx.drawImage(path, 0, 0, this.width, this.height)

    ctx.draw()

 uni.canvasToTempFilePath({

      canvasId: 'camCacnvs',

      success: function (res) {

          var tempFilePath = res.tempFilePath;

          that.$emit('sumbit', res,that.Strokes)

          },

  fail: (err) => {

   console.log('fail', err)

  }

},this)

这个时候就发现了一个新的问题,旋转之后生成的图片是一个空白的图片,找了好久之后发现是因为调用uni.canvasToTempFilePath方法的时候canvas还没有画完图片。所以加了一个setTimeout。最后的代码是这样的

const that =this

const ctx = uni.createCanvasContext('camCacnvs',this);

    ctx.translate(0, this.width);

    ctx.rotate(-90 * Math.PI / 180)

    ctx.drawImage(path, 0, 0, this.width, this.height)

    ctx.draw()

setTimeout(()=> {

 uni.canvasToTempFilePath({

      canvasId: 'camCacnvs',

      success: function (res) {

          var tempFilePath = res.tempFilePath;

          that.$emit('sumbit', res,that.Strokes)

          },

  fail: (err) => {

   console.log('fail', err)

  }

},this)

}, 200);

好啦接下来就完成了。成品是这个样子的

微信图片_20211202143015.png