How to fill the 'opposite' shape on canvas?

前端 未结 4 509
小蘑菇
小蘑菇 2020-12-08 04:45

Say I have a circle (an arc) on HTML5 canvas. I can just fill it like this:

ctx.arc(100, 100, 50, 0, 2 * Math.PI);
ctx.fill();

It works a t

4条回答
  •  醉酒成梦
    2020-12-08 05:17

    You can do that using another canvas as mask :

    // This is the canvas where you want to draw
    var canvas = document.getElementById('your-canvas');
    var ctx = canvas.getContext('2d');
    
    // I'll use a skyblue background that covers everything
    // Just to demonstrate
    ctx.fillStyle = "skyblue";
    ctx.fillRect(0, 0, canvas.width, canvas.height);
    
    // Create a canvas that we will use as a mask
    var maskCanvas = document.createElement('canvas');
    // Ensure same dimensions
    maskCanvas.width = canvas.width;
    maskCanvas.height = canvas.height;
    var maskCtx = maskCanvas.getContext('2d');
    
    // This color is the one of the filled shape
    maskCtx.fillStyle = "black";
    // Fill the mask
    maskCtx.fillRect(0, 0, maskCanvas.width, maskCanvas.height);
    // Set xor operation
    maskCtx.globalCompositeOperation = 'xor';
    // Draw the shape you want to take out
    maskCtx.arc(30, 30, 10, 0, 2 * Math.PI);
    maskCtx.fill();
    
    // Draw mask on the image, and done !
    ctx.drawImage(maskCanvas, 0, 0);

    Demo here.

提交回复
热议问题