canvas - 从剪裁的画布中减去形状

时间:2016-09-22 12:10:11

标签: javascript html5 canvas clip

我想通过javascripts画布从图像剪辑环(即环)。 我已经有了一种方法,但我认为它太不优雅了(我真的不明白为什么这样做,以及它为什么不会产生一个较小的圆圈)。

see this jsfiddle

    context.drawImage(imageObj, 0, 0, 500, 500);

    //crop outer circle
    context2.beginPath();
    context2.arc(250, 250, 200, 0, 2 * Math.PI, false);
    context2.closePath();
    context2.clip();

    //draw circle
    context2.drawImage(canvas,0,0);

    //crop inner circle
    context2.beginPath();
    context2.arc(250, 250, 100, 0, 2 * Math.PI, false);
    context2.closePath();
    context2.clip();

    //clear context 2
    context2.clearRect(0,0,500,500)

    // finally draw annulus
    context2.drawImage(canvas2,0,0);

有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

这确实有效,因为clip方法调用的剪切区域会堆叠。

IMO,这确实不是最好的方法,因为你肯定需要在剪辑之前调用ctx.save();,之后调用ctx.restore(),这是非常重的方法。

我首选的方法是使用compositing



var ctx = canvas.getContext('2d');

var imageObj = new Image();

imageObj.onload = function() {

  ctx.drawImage(imageObj, 0, 0, 500, 500);
  // keep only the outer circle
  ctx.globalCompositeOperation = 'destination-in';
  ctx.beginPath();
  ctx.arc(250, 250, 200, 0, 2 * Math.PI, false);
  ctx.fill();
  // remove the inner one
  ctx.globalCompositeOperation = 'destination-out';
  ctx.beginPath();
  ctx.arc(250, 250, 100, 0, 2 * Math.PI, false);
  ctx.fill();
  // reset gCO
  ctx.globalCompositeOperation = 'source-over';

};
imageObj.src = 'http://www.html5canvastutorials.com/demos/assets/darth-vader.jpg';

<canvas id="canvas" width="500" height="500"></canvas>
&#13;
&#13;
&#13;