スタイルの「反転した」クリップ形状を使用して確実にクリップできます。最初に画面のアウトラインを描画し、次にクリッピング パスを描画し (beginPath を使用せずに)、パスとクリップを閉じます。
このように、あなたが説明する形状は画面内の「穴」です。
パス関数は閉じたパスを記述する必要があります。
デモはこちら : http://jsfiddle.net/gamealchemist/9DuJL/40/
交差しなければ、複数の形状でも機能することがわかります。
コードは次のようになります。
// clips the canvas with the invert of provided path function
// if pathFunction is an array, remove clips defined by all functions
function clipRevert(pathFunction) {
ctx.beginPath();
ctx.rect(0, 0, canvas.width, ctx.canvas.height);
if (Array.isArray(pathFunction)) pathFunction.forEach(execute);
else pathFunction();
ctx.clip();
}
function execute(fn) {
return fn();
}
使用例:(円の反転クリップを使用して画像を描画します):
function circlePath(x, y, r) {
ctx.arc(x, y, r, 0, Math.PI * 2, true);
}
window.clipRevertExample = function () {
ctx.save();
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
clipRevert(circlePath.bind(null, 100, 60, 40));
ctx.drawImage(img, 0, 0);
ctx.restore();
}
最後の注意: 実際には、減算する任意のベース シェイプを選択できます。