代码之家  ›  专栏  ›  技术社区  ›  LePioo

画布变换旋转瑕疵

  •  1
  • LePioo  · 技术社区  · 6 年前

    我得到了一个简单的图像旋转的小代码

    var img = new Image(50, 200);
    img.addEventListener("load", (e) => {
      setInterval(function() {
        main.getContext("2d").clearRect(0, 0, 600, 400);
        main.getContext("2d").rotate(-1 * Math.PI / 180);
        main.getContext("2d").drawImage(img, 0, 0, 50, 200, 0, 0, 50, 200);
      }, 50);
    });
    img.src = "https://i.stack.imgur.com/gCWW9.png";
    <body>
      <canvas id="main" width=600 height=400></canvas>
    </body>

    链接的矩形图像资源: the rectangle image resource

    结果: enter image description here

    为什么它会生成所有这些工件?

    2 回复  |  直到 6 年前
        1
  •  1
  •   LePioo    6 年前

    实际上我发现了这个问题,似乎变换矩阵也对clearRect()方法有影响,所以“清除区域”也会旋转。。。

    只需添加setTransform(1,0,0,1,0,0),在调用clearRect()之前重置转换矩阵,如下所示:

    var rotation=0;
    var img = new Image(50, 200);
        img.addEventListener("load", (e) => {
            setInterval(function() {
            rotation--;
            main.getContext("2d").setTransform(1,0,0,1,0,0);         //that line was missing
            main.getContext("2d").clearRect(0, 0, 600, 400);
            main.getContext("2d").rotate(rotation * Math.PI / 180);
            main.getContext("2d").drawImage(img, 0, 0, 50, 200, 0, 0, 50, 200);
            }, 50);
    });
    img.src = "https://i.stack.imgur.com/gCWW9.png";
    <body>
    <canvas id="main" width=600 height=400></canvas>
    </body>
        2
  •  0
  •   yue you    6 年前

    根据@GolfWolf的评论,我使用了以下代码,它可以正常工作。

    var img = new Image(50, 200);
    img.addEventListener("load", (e) => {
      setInterval(function() {
        main.getContext("2d").clearRect(-0.5, -0.5, 600, 400);
        main.getContext("2d").rotate(-1 * Math.PI / 180);
        main.getContext("2d").drawImage(img, 0, 0, 50, 200, 0, 0, 50, 200);
      }, 50);
    });
    img.src = "https://i.stack.imgur.com/gCWW9.png";
    <body>
      <canvas id="main" width=600 height=400></canvas>
    </body>