前端使用canvas实现图片旋转,得到base64

需求就是将图片旋转180度,把旋转后的图片base64传给后端,主要用到canvas
在这里插入图片描述
旋转的核心代码如下:

  // src是需要旋转的图片url, rotate旋转的角度
  function rotateImg(src, rotate) {
    return new Promise((resolve, reject) => {
      let img = new Image();
      img.src = src;
      img.setAttribute('crossOrigin', 'Anonymous');
      img.onload = () => {
        let canvas = document.createElement('canvas');
        let context: any = canvas.getContext('2d');
        if (rotate > 45 && rotate <= 135) {
          // 90 宽高颠倒
          canvas.width = img.height;
          canvas.height = img.width;
        } else if (rotate > 225 && rotate <= 315) {
          // 270 宽高颠倒
          canvas.width = img.height;
          canvas.height = img.width;
        } else {
          canvas.width = img.width;
          canvas.height = img.height;
        }
        context.clearRect(0, 0, canvas.width, canvas.height);
        context.translate(canvas.width / 2, canvas.height / 2);
        context.rotate((rotate * Math.PI) / 180);
        context.translate(-canvas.width / 2, -canvas.height / 2);
        context.drawImage(
          img,
          canvas.width / 2 - img.width / 2,
          canvas.height / 2 - img.height / 2,
          img.width,
          img.height
        );
        context.translate(canvas.width / 2, canvas.height / 2);
        context.rotate((-rotate * Math.PI) / 180);
        context.translate(-canvas.width / 2, -canvas.height / 2);
        context.restore();
        let base64 = canvas.toDataURL();
        resolve(base64);
      };
      img.onerror = reject;
      img.setAttribute('crossOrigin', 'anonymous'); //关键
    });
  }

我这边需求的使用场景代码:

  // 通过旋转角度监听是否进行旋转
  useEffect(() => {
    if (angle) {
      rotateImg(imgBaseURL + url, angle)
        .then((base64) => {
          handleRotate(base64);
        })
        .catch((err) => {
          console.log(err);
        });
    }
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [angle]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值