javascript - 如何从 <canvas> 中的一张图像中捕获多张图像?

标签 javascript html image canvas crop

我编写了一些代码,在可以通过触摸绘制的图像上绘制半透明矩形:

function drawRect() {
  var canvas = document.getElementById('receipt');
  var ctx = canvas.getContext('2d');
  var drag = false;
  var imageObj;
  var rect = { };
  var touch;

  canvas.width = WIDTH;
  canvas.height = HEIGHT;

  function init() {
    imageObj = new Image();

    imageObj.src = 'img.jpg';
    imageObj.onload = function() {
      ctx.drawImage(imageObj, 0, 0);
    };

    canvas.addEventListener('touchstart', handleTouch, false);
    canvas.addEventListener('touchmove', handleTouch, false);
    canvas.addEventListener('touchleave', handleEnd, false);
    canvas.addEventListener('touchend', handleEnd, false);
  }

  function handleTouch(event) {
     if (event.targetTouches.length === 1) {
       touch = event.targetTouches[0];

     if (event.type == 'touchmove') {
        if (drag) {
          rect.w = touch.pageX - rect.startX;
          rect.h = touch.pageY - rect.startY ;
          draw();
        }
      } else {
        rect.startX = touch.pageX;
        rect.startY = touch.pageY;
        drag = true;
      }
    }
  }

  function handleEnd(event) {
    drag = false;
  }

  function draw() {
    drawImageOnCanvas();
    ctx.fillStyle = 'rgba(0, 100, 255, 0.2)';
    ctx.fillRect(rect.startX, rect.startY, rect.w, rect.h);
  } 

  function drawImageOnCanvas() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.drawImage(imageObj, 0, 0);
  }

  init();
}

这有效。但是,现在我想要拥有它,以便我可以将矩形中的图像的每个部分捕获为单独的图像。

我怎样才能做到这一点?因为我有重画的东西,它删除了以前的矩形,这使得这变得很困难。

最佳答案

Canvas 只能将整个 Canvas 保存为图像,因此技巧是创建一个临时 Canvas ,其大小与您要保存的区域的大小相同。

一种方法是创建一个函数,该函数将图像和矩形对象作为参数并返回该区域的 data-uri(或 Blob):

function saveRegion(img, rect) {

   var canvas = document.createElement("canvas"),
       ctx = canvas.getContext("2d");

   canvas.width = rect.w;
   canvas.height = rect.h;
   ctx.drawImage(img, rect.startX, rect.startY, rect.w, rect.h, 0, 0, rect.w, rect.h);

   return canvas.toDataURL():
}

如果不希望顶部有任何图形,您可以传入原始图像,或者如果您在其顶部绘制元素,则只需传入原始 Canvas 元素作为图像源。当然,CORS 限制也适用。

关于javascript - 如何从 <canvas> 中的一张图像中捕获多张图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30009710/

相关文章:

javascript - 根据 Woocommerce 3 中的送货方式显示或隐藏结帐字段

javascript - Atom Electron webview 上下文菜单,获取点击目标

html - 我在这个 CSS 布局中做错了什么?

Java游戏帧率下降

c# - 解析图像数据 URI 的正则表达式

java - 为什么 ImageIO.read() 与 Toolkit.getDefaultToolkit().getImage() 相比这么慢?

javascript - usemin 为输入 Assets 文件使用了错误的目录

javascript - jQuery 根据下拉列表中的选择将行移动到另一个表

html - 可以在 CSS 中抑制吗?

javascript - webpack-dev-server 不会自动重新加载和构建 - 配置问题