初学canvas之踩坑

286 阅读3分钟

画一个简单的图片

initCanvas() {
      //  获取canvas
      let canvas = document.getElementById("myCanvas");
      let w = "750";
      let h = "1334";
      canvas.width = w;
      canvas.height = h;
      let ctx = canvas.getContext("2d");
      let res = `https://zk-static-1301841918.cos.ap-nanjing.myqcloud.com/mbtl/r/${this.result_1}${this.result_2}${this.result_3}${this.result_4}.jpg`;
      let img = document.createElement("img");
      img.setAttribute("crossOrigin", "anonymous");
      img.src = res;
      img.onload = () => {
        ctx.drawImage(img, 0, 0, w, h);
        };
      };
    },

这样就可以画出一个图片

画布里画一个头像

  • 首先要先把图片画出来然后画圆形 其中一些属性里的属性值自己搞的
   initCanvas() {
      //  获取canvas
      let canvas = document.getElementById("myCanvas");
      let w = "750";
      let h = "1334";
      canvas.width = w;
      canvas.height = h;
      let ctx = canvas.getContext("2d");
        ctx.drawImage(img, 0, 0, w, h);
        let avatar = this.avatar;
        let ai = document.createElement("img");
        ai.src = avatar;
        ai.onload = () => {
          ctx.save();
          ctx.beginPath();
          ctx.arc(594, 140, 85, 0, 2 * Math.PI, false);
          ctx.clip(); //剪切路径
          ctx.drawImage(ai, 0, 0, ai.width, ai.height, 509, 55, 170, 170);
          ctx.restore();
      };
    },
  • .arc(594, 140, 85, 0, 2 * Math.PI, false); 官方文档里是这样说的: CanvasRenderingContext2D .arc()  是 Canvas 2D API 绘制圆弧路径的方法。 圆弧路径的圆心在  (x, y)  位置,半径为 r ,根据anticlockwise (默认为顺时针)指定的方向从 startAngle 开始绘制,到 endAngle 结束。 语法:
void ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);

其中,x表示圆弧中心(圆心)的x轴坐标;y表示圆弧中心(圆心)的y轴坐标;radius表示圆弧的半径;startAngle表示圆弧的起始点,x轴方向开始计算,单位以弧度表示;endAngle表示圆弧的终点,单位以弧度表示,anticlockwise表示boolean值,如果为true,逆时针绘制圆弧,反之。 画一个圆形,首先你要先画出正方形,也就是:

ctx.drawImage(ai, 0, 0, ai.width, ai.height, 509, 55, 170, 170);

解释参数: Canvas 2D API 中的 CanvasRenderingContext2D .drawImage()  方法提供了多种方式在Canvas上绘制图像。 语法:

void ctx.drawImage(image, dx, dy);
void ctx.drawImage(image, dx, dy, dWidth, dHeight);
void ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);

其中,image是你要绘制的图片;sx是image的矩形裁剪选择框的左上角x轴的坐标;sy是image矩形裁剪选择框的左上角y轴坐标;swidth是image的宽度;sHeight是image的高度;dx是image的左上角在目标canvas上x轴坐标;dy是image左上角在目标canvas上y轴坐标;dWidth是在目标canvas上绘制的宽度,允许对绘制的image进行缩放;dHeight是在目标canvas上绘制的高度,允许对绘制的image进行缩放 然后根据画出的正方形进行裁剪:

          ctx.save();
          ctx.beginPath();
          ctx.arc(594, 140, 85, 0, 2 * Math.PI, false);
          ctx.clip(); //剪切路径
          ctx.restore();

如果实在搞不懂arc里面参数坐标,可以看drawImage里的参数:x=dx+dWidth/2,y=dy+dHeight/2,radius=dWidth/2

用canvas来解决图片跨域问题的话,就必须加这个属性
img.setAttribute("crossOrigin", "anonymous");

官方解释: 设置指定元素上的某个属性值。如果属性已经存在,则更新该值;否则,使用指定的名称和值添加一个新的属性。 要获取某个属性当前的值,可使用 getAttribute();要删除某个属性,可使用 removeAttribute()。 语法:

element.setAttribute(name, value);

举例: 绘制一张图片,图片里有头像,用户名

  initCanvas() {
      //  获取canvas
      let canvas = document.getElementById("myCanvas");
      let w = "750";
      let h = "1334";
      canvas.width = w;
      canvas.height = h;
      let ctx = canvas.getContext("2d");
      let res = `https://zk-static-1301841918.cos.ap-nanjing.myqcloud.com/mbtl/r/${this.result_1}${this.result_2}${this.result_3}${this.result_4}.jpg`;
      let img = document.createElement("img");
      img.setAttribute("crossOrigin", "anonymous");
      img.src = res;
      img.onload = () => {
        ctx.drawImage(img, 0, 0, w, h);
        let avatar = this.avatar;
        let ai = document.createElement("img");
        ai.setAttribute("crossOrigin", "anonymous");
        ai.src = avatar;
        ai.onload = () => {
          ctx.save();
          ctx.beginPath();
          ctx.arc(594, 140, 85, 0, 2 * Math.PI, false);
          ctx.clip(); //剪切路径
          ctx.drawImage(ai, 0, 0, ai.width, ai.height, 509, 55, 170, 170);
          ctx.restore();
          ctx.font = "43px Georgia";
          ctx.fillStyle = "#ffffff";
          ctx.fillText(this.name?this.name:'', 270, 163,230);
          this.ImgUrl = canvas.toDataURL();
          console.log(this.ImgUrl);
        };
      };
    },