私はしばらくの間このバグの上に私の髪を引っ張っていた。キャンバスの3つのセクションにイメージをレンダリングし、オーバーラップさせないようにしたかったのです。基本的には、画像を分離した状態に保つためにcanvas.getContext('2d').clip()
を使いたかったのです。ただし、画像を描画した後にcanvas.getContext('2d').beginPath()
に電話をかけるとクリップが機能します。javascript canvas2dのクリッピングにパスが必要なのはなぜですか?
だから、これは(何のクリップが適用されていない)動作しません。
this.draw=function(image, cx, cy, width, height, clip){
var ctx = this.canvas.getContext('2d');
ctx.save();
ctx.rect(clip.x, clip.y, clip.width, clip.height);
ctx.clip();
ctx.fillStyle = "black";
ctx.fillRect(clip.x, clip.y, clip.width, clip.height);
ctx.drawImage(image,cx-width/2,cy-height/2,width,height);
ctx.restore();
return this;
};
しかし、この処理が行われます。
this.draw=function(image, cx, cy, width, height, clip){
var ctx = this.canvas.getContext('2d');
ctx.save();
ctx.rect(clip.x, clip.y, clip.width, clip.height);
ctx.clip();
ctx.fillStyle = "black";
ctx.fillRect(clip.x, clip.y, clip.width, clip.height);
ctx.drawImage(image,cx-width/2, cy-height/2,width,height);
ctx.beginPath();// <------WITCHCRAFT
ctx.restore();
return this;
};
それは私がbeginPath()
は、問題を修正することを発見し、総事故だった、と私理由は分かりません。誰も私にこれを説明することはできますか?
あなたは新しいパスを開始し、古いパスで完了している文脈を伝える方法ではありません。ところで、beginPathはパスを作成する直前(コードの 'ctx.save()'の直後)に行かなければなりません。 fillRectの代わりにctx.arcを使用していれば、アークをクリップに追加してしまったので、うまくいきました。 – Blindman67
私はまだ[rect()](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/rect)のドキュメントで、サブパスが閉じたとしてマークされます。また、 'ctx.arc(256,256,512,0,3.1416 * 2、true);'でfillRect行を置き換えると、クリッピングはまだ動作します(512x512キャンバス)。公平になるためには、save();の直後に移動するとまだ機能します。 – Kenkron
多くの場合、beginPath()は時間の経過とともに移動するように思われます。これは、クリッピングパスでは使用できません。それはあまりにも終わったので、イメージに使うことはできません。これは、パスが開始された後にクリップ命令が適用されたようなものですが、開始されると、クリップ呼び出し以降に既に描画されたイメージを遡ってクリップすることができます。 – Kenkron