Skip to content

canvas画布缩放

vue
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      canvas {
        border: 1px solid #000;
      }
    </style>
  </head>
  <body>
    <canvas></canvas>
    <script>
      const canvas = document.querySelector("canvas");
      const ctx = canvas.getContext("2d");
      canvas.width = 500;
      canvas.height = 500;
      const img = new Image();
      img.src = "./pic.png";
      img.onload = function () {
        draw(0, 0, 0.5);
      };

      let isDrag = false;
      let lastX = 0,_lastX = 0;
      let lastY = 0,_lastY = 0;

      canvas.addEventListener("mousedown", function (e) {
        isDrag = true;
        lastX = e.clientX - _lastX;
        lastY = e.clientY - _lastY;
      });

      canvas.addEventListener("mousemove", function (e) {
        if (isDrag) {
          const x = e.clientX;
          const y = e.clientY;
          const dx = x - lastX;
          const dy = y - lastY;
          _lastX = dx;
          _lastY = dy;
          draw(dx, dy, scale);
        }
      });

      canvas.addEventListener("mouseup", function (e) {
        isDrag = false;
      });

      let scale = 0.5;

      canvas.onmousewheel = function (e) {
        console.log(e)
        e.preventDefault();
        const delta = e.wheelDelta / 1800;
        scale += delta;
        scale = Math.max(0.1, scale);
        scale = Math.min(scale, 4);
        draw(_lastX, _lastY, scale);
      };

      function draw(dx, dy, scale) {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.save();
        ctx.translate(lastX + dx, lastY + dy);
        ctx.scale(scale, scale);
        // 绘制图片
        ctx.drawImage(
          img,
          -img.width / 2,
          -img.height / 2,
          img.width,
          img.height
        );

        // 进行其他绘制操作,如绘制矩形边框、文字等

        // 恢复绘图状态
        ctx.restore();
      }
    </script>
  </body>
</html>

MIT Licensed