現状の質問は、IMO が少し不明確です。クリッピングが必要なシナリオに適用できるより一般的な答えを与えるには、(少なくとも) 2 つのアプローチを使用できます。
方法 1 - コンポジット モードを使用してクリップする
合成モードは最も単純な方法ですが、クリッピング マスクを透明な背景 (通常は PNG) を持つ画像として事前に定義する必要があるため、柔軟性が最も低くなります。
画像のソリッド部分を使用して次に描画されるものを切り取るか、透明な領域を使用して塗りつぶすことができます。
これは、ソリッド パーツを使用して次に描画される形状/画像を切り取る方法です。
/// draw the shape we want to use for clipping
ctx1.drawImage(imgClip, 0, 0);
/// change composite mode to use that shape
ctx1.globalCompositeOperation = 'source-in';
/// draw the image to be clipped
ctx1.drawImage(img, 0, 0);
ここではglobalCompositeOperation
が に変更されてsource-in
います。これは、ソース イメージ (デスティネーションの次に描画するイメージ) が既存のソリッド データ内に描画されることを意味します。透明な領域には何も描画されません。
クリッピング マスクが次のようになっている場合 (ネットからのランダムなフェアユース):
そして、私たちのイメージは次のようになります:
結果は次のようになります。
方法 2 - パスを使用してクリップする
クリッピングのパスを定義することもできます。必要に応じてパスを調整したり、アニメーション化したりできるため、これは非常に柔軟です。
注: Path を使用したクリッピングは現在、ブラウザーでは少し「壊れやすい」ため、ブラウザーは現時点でクリップをリセットできないため、クリップ パスを設定して使用する前と後にsave()
使用することを検討する必要があります (デフォルトのクリップ = キャンバス全体);restore()
restore
簡単なジグザグ パスを定義しましょう (これはあなたの場合は波になります)。
/// use save when using clip Path
ctx2.save();
ctx2.beginPath();
ctx2.moveTo(0, 20);
ctx2.lineTo(50,0);
/// ... more here - see demo
ctx2.lineTo(400, 20);
ctx2.lineTo(400, 100);
ctx2.lineTo(0, 100);
ctx2.closePath();
/// define this Path as clipping mask
ctx2.clip();
/// draw the image
ctx2.drawImage(img, 0, 0);
/// reset clip to default
ctx2.restore();
キャンバスに描画されたものを使用してクリッピング マスクを設定したのでclip
、次に、その形状の内側に収まるようにクリッピングします (形状が開始した場所で終了できることを確認してください)。