2016-08-17 9 views
0

私はしばらくの間このバグの上に私の髪を引っ張っていた。キャンバスの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()は、問題を修正することを発見し、総事故だった、と私理由は分かりません。誰も私にこれを説明することはできますか?

+1

あなたは新しいパスを開始し、古いパスで完了している文脈を伝える方法ではありません。ところで、beginPathはパスを作成する直前(コードの 'ctx.save()'の直後)に行かなければなりません。 fillRectの代わりにctx.arcを使用していれば、アークをクリップに追加してしまったので、うまくいきました。 – Blindman67

+0

私はまだ[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

+0

多くの場合、beginPath()は時間の経過とともに移動するように思われます。これは、クリッピングパスでは使用できません。それはあまりにも終わったので、イメージに使うことはできません。これは、パスが開始された後にクリップ命令が適用されたようなものですが、開始されると、クリップ呼び出し以降に既に描画されたイメージを遡ってクリップすることができます。 – Kenkron

答えて

0

クリッピングにパスが必要なので、おそらくあなたはドキュメントでそれを逃したでしょう。ここではMDNのドキュメントが言うことだ:

キャンバスの2D APIのCanvasRenderingContext2D.clip()メソッドは、現在、現在のクリッピングパスに組み込まれているパスになります。

(強調鉱山)

それはパスが必要理由マスクをクリッピングするピカチュウの輪郭に円の長方形から任意の形状とすることができるからです。完全を期すために


、ここでのW3C仕様は.clip()について言っているのです:

https://www.w3.org/TR/2dcontext/#drawing-paths-to-the-canvas

コンテキスト。 clip() クリッピング領域を現在のパスにさらに制限します。

+0

パスはまだありませんか?おそらくあなたはその質問にそれを見逃しました。 'ctx.rect(clip.x、clip.y、clip.width、clip.height); ctx.clip();'これが役に立たない理由は、パスコードがそこにあったからです両方の場合において。完全性のために、W3C仕様書が 'rect()'について述べていることは次のとおりです:[矩形のパスを作成する](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/ rect) – Kenkron

関連する問題