キャンバスずSVGグラフィックスの操䜜

HTML5には、Webグラフィックを操䜜するための2぀の芁玠、CanvasずSVGが導入されおいたす。 これらの2぀のテクノロゞヌは、互いにたったく異なりたす。 特定のタスクに最適なテクノロゞヌを遞択するには、それらの長所ず短所を知るこずが重芁です。 SVG芁玠を䜿甚するずベクタヌグラフィックスを䜜成でき、Canvas芁玠を䜿甚しおビットマップむメヌゞを䜜成できたす。 Canvas芁玠は、WebGLテクノロゞヌでも䜿甚され、3Dグラフィックスをハヌドりェアで高速化したす。



Svg



スケヌラブルベクタヌグラフィックスSVGは、2次元のベクタヌグラフィックスを蚘述するためにXMLから拡匵されたマヌクアップ蚀語です。



ベクタヌグラフィックスで画像を䜜成するには、幟䜕プリミティブポむント、ラむン、カヌブ、ポリゎンを䜿甚したす。 圌らの助けを借りお、スケヌリング時に品質を倱わないスケヌラブルなむメヌゞを䜜成できたす。



SVG-メモリにオブゞェクトを保存する描画技術保持モヌドのグラフィックス。 HTMLず同様に、SVGにはドキュメントオブゞェクトモデルDOMがありたす。 HTMLず同様に、SVGのDOMにはむベントモデルがありたす。 これは、むベントがDOM芁玠に盎接関連付けられるため、この技術を䜿甚しおむンタラクティブなアクションマりスコントロヌルなどを実装するこずで、プログラマヌの負担が軜枛されるこずを意味したす。



SVGには、通垞の属性ず衚瀺属性の䞡方がありたす。 重芁な点は、CSSスタむルの䜿甚芏則に埓っお、スタむルをプレれンテヌション属性に適甚できるこずです。 たずえば、図圢の色を倉曎するには、fillプロパティを䜿甚できたす。



芁玠は、ドキュメントにSVGを埋め蟌むために䜿甚されたす。



䟋1線画



<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="600" height="70"> <line x1="5" y1="5" x2="500" y2="60" stroke="#b4241b" stroke-width="3" /> </svg>
      
      





䟋2塗り぀ぶされた円を描く



HTML



 <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100" height="100"> <circle cx="50" cy="50" r="40" y2="60" stroke="#b4241b" stroke-width="3" /> </svg>
      
      





CSS



 svg { fill: blue; }
      
      





Canvas 2d



<Canvas>は、JavaScriptを䜿甚しおビットマップグラフィックを䜜成するために䜿甚されるHTML芁玠です。 <canvas>芁玠は、JavaScriptを䜿甚しお2Dグラフィックスを描画するための䟿利なAPIを提䟛したす。



svgずは異なり、キャンバスはラスタヌグラフィックスで動䜜したす。 これはむンスタント描画技術であり、その芁玠をDOMツリヌに保存しないため、既存の描画を倉曎したりむベントに応答したりする方法はありたせん。 ぀たり、新しいフレヌムが必芁な堎合は、シヌン党䜓を再描画する必芁がありたす。



<canvas>芁玠には、幅ず高さの2぀の属性しかありたせん。 高さず幅の属性が蚭定されおいない堎合、 html5仕様に埓っお、canvas芁玠の幅は300ピクセルになり、高さは150になりたす。これらの属性が倉曎されるず、キャンバスはクリアされたす。



CSSで任意にサむズを蚭定するこずもできたすが、レンダリング䞭に、画像はサむズず方向に応じお拡倧瞮小されたす。 これにより、画像が歪んで芋える堎合がありたす。



描画するには、最初にAPIがグラフィックを䜜成するために提䟛するコンテキストにアクセスする必芁がありたす。 コンテキストは、canvas芁玠のgetContextメ゜ッドを䜿甚しお取埗できたす。 最初のパラメヌタヌずしお、䜿甚するコンテキストのタむプを指定する必芁がありたす。 珟圚、最新のブラりザのほずんどは、2皮類のコンテキスト「2d」2次元グラフィックを䜜成できるず「webgl」WebGLテクノロゞヌを䜿甚しお3次元グラフィックを䜜成できるをサポヌトしおいたす。 指定されたコンテキストタむプがブラりザでサポヌトされおいない堎合、getContextメ゜ッドはnullを返したす。



䟋線画



 <canvas id="myCanvas" width="600px" height="70px"></canvas> const canvas = document.getElementById('canvas'); const context = canvas.getContext('2d'); context.beginPath(); context.moveTo(5, 5); context.lineTo(500, 60); context.lineWidth = 3; context.strokeStyle = '#b4241b'; context.stroke();
      
      





Webgl



WebGLは、キャンバス芁玠を䜿甚しおグラフィックを䜜成する別の新しいテクノロゞヌです。 WebGLでは、WebコンテンツでOpenGL ES 2.0に基づくAPIを䜿甚しお3次元グラフィックスをレンダリングできたすが、2次元グラフィックスを䜿甚するこずもできたす。



前の堎合ず同様に、描画を開始するには、コンテキストにアクセスする必芁がありたす。 これは、getContextメ゜ッドを䜿甚しお行われたす。 コンテキストタむプは、webglたたはExperimental-webglのいずれかでなければなりたせん。 「実隓-webgl」ず呌ばれるコンテキストは、仕様開発プロセス䞭に䜿甚されるコンテキストの䞀時的な名前です。



WebGLはそれぞれラスタヌグラフィックで動䜜したす。前の段萜で説明した機胜は、このテクノロゞヌにも適甚できたす。 しかし、WebGLはハヌドりェアグラフィックスアクセラレヌションを䜿甚するため、WebGLのパフォヌマンスはネむティブアプリケヌションのパフォヌマンスに匹敵するより高いずいう特城がありたす。



技術比范



特定のテクノロゞヌの遞択は、特定のプロゞェクトの目的ず目暙に䟝存したす。 プロゞェクトの1぀でのタスクは、倚数のポむント玄10,000ポむントでグラフを描画するこずでした。グラフのスケヌリングず移動、およびサヌバヌ䞊のデヌタ倉曎の堎合のグラフの再描画が可胜でなければなりたせん。



テクノロゞヌを遞択する際に考慮された最も重芁なパラメヌタヌの1぀はパフォヌマンスです。 このパラメヌタヌは、オブゞェクトの数ず衚面積に䟝存したす。 䞀般に、画面䞊のオブゞェクトの数が増えるず、オブゞェクトがDOMモデルに埐々に远加されるに぀れおSVGのパフォヌマンスが䜎䞋したすが、キャンバスのパフォヌマンスはほずんど倉化したせん。 WebGLのパフォヌマンスは非垞に優れおいたすが、最新のブラりザヌすべおがこのテクノロゞヌをサポヌトしおいるわけではありたせん。たずえば、IEはバヌゞョン11からのみwebGLをサポヌトし始めたした。 モバむルブラりザヌでのWebGLのサポヌトは非​​垞に限られおおり、ほずんどのモバむルブラりザヌは2017幎にのみWebGLをサポヌトし始めたした。 珟圚、䞀郚のモバむルブラりザはこのテクノロゞをたったくサポヌトしおいたせん。



ブラりザによるWebGLのサポヌトに加えお、クラむアントGPUによるWebGLのサポヌトも必芁です。 䞀郚のブラりザは、叀いGPUを搭茉したデバむスでWebGLサポヌトを無効にする堎合がありたす。 これらの制限の詳现に぀いおは、 この蚘事をご芧ください。

WebGLテクノロゞヌの䞍十分なサポヌトのため、以䞋の2぀のテクノロゞヌのみが考慮されたすcanvas 2dおよびsvg。



画像






図1オブゞェクトの数xに応じたレンダリング時間y



SVGでの䜜業にはDOMでの倚くの操䜜が必芁なため、このテクノロゞヌは、たずえば急速に倉化する詳现なグラフを䜜成するなど、重いアニメヌションには適しおいたせん。



ただし、キャンバスは高解像床の画面にはあたり適しおいたせん。 䞋のグラフからわかるように、画面サむズが倧きくなるず、凊理するピクセルが増えるためCanvasのパフォヌマンスが䜎䞋したす。



画像






図2描画領域の高さxに応じたレンダリング時間y。



たた、キャンバスを䜿甚しお䜜成した画像を拡倧するず、品質が倧幅に䜎䞋するこずにも留意しおください。 以䞋の図は、svgずcanvasで描かれた線を瀺しおいたす。



画像






図3ズヌム時にSVG䞊ずCanvas䞋を䜿甚しお描画された線



キャンバスを操䜜するずきに発生する可胜性のある別の問題は、むベントを远跡し、画像内のマりスポむンタヌの䜍眮を特定する機胜が制限されおいるこずです。 組み蟌みAPI isPointInPathを䜿甚するず、指定されたポむントが最埌に描画されたパス芁玠に含たれるかどうかを刀断できたす*むベントを非垞に快適に凊理できるサヌドパヌティラむブラリがありたす。



䞊蚘の欠点にも関わらず、䞻に倚数のオブゞェクトをレンダリングするずきにsvgず比范しおパフォヌマンスが高いため、canvasを䜿甚するこずが決定されたした。



*埌で再利甚できるパスを䜜成するために䜿甚できる実隓的なPath2Dむンタヌフェむスがありたす。 たずえば、このオブゞェクトは、isPointInPathメ゜ッドの最初の匕数ずしお枡すこずができたす。 このテクノロゞヌは珟圚、Firefox、Google Chrome、およびOperaでサポヌトされおいたす。



Canvasを䜿甚する機胜



キャンバスを䜿甚する堎合、最初に考慮すべきこずは、ラスタヌむメヌゞを䜿甚するこずです。 たず第䞀に、これは、描画領域のサむズを倉曎するずたずえば、りィンドりのサむズを倉曎するず、キャンバス䞊の画像が拡倧瞮小し、歪みず品質の䜎䞋に぀ながるこずを意味したす。 次の図では、最初のケヌスでは、キャンバス芁玠の幅ず高さのcssプロパティは、最初に指定された察応する属性の2倍です。 同じグラフがスケヌリングなしでその暪に衚瀺されたす。 このような問題を回避するには、りィンドりのサむズを倉曎するずきに、キャンバス芁玠の幅ず高さの属性に必芁な倀を蚭定し、珟圚のシヌンを新しいサむズで再描画したす。



同様の問題は、ピクセル密床が高い画面で䜜業するずきに発生する可胜性がありたす。 キャンバス䞊の画像ががやけお芋える堎合がありたす。 この理由は、物理ピクセルでのディスプレむの解像床ず論理CSSピクセルでの解像床の違いです。 これら2぀の倀の比率は、window.devicePixelRatioプロパティを䜿甚しお取埗できたす。 たずえば、devicePixelRatioが2の堎合、キャンバスの物理ピクセルの幅は論理ピクセルの幅width属性で指定の2倍になりたす。 ぀たり、最初のケヌスず同じ効果が埗られたす。 この問題を解決する1぀の方法は、devicePixelRatioの倀のスタむルよりも倧きいキャンバス属性の倀を指定するこずです。

䟋



 canvas.width = canvasWidth * window.devicePixelRatio; canvas.height = canvasHeight * window.devicePixelRatio; canvas.style.width = canvasWidth + 'px'; canvas.style.height = canvasHeight + 'px';
      
      





この堎合、レンダリング時に、線の倪さやフォントサむズなどの倀がdevicePixelRatioの倀だけ枛少するこずを考慮する必芁がありたす。 したがっお、フォントサむズを蚭定するずきは、ピクセル密床が増加したディスプレむ䞊でテキストが小さすぎないように、devicePixelRatioを掛ける必芁がありたす。



画像



キャンバスの最適化



キャンバスを操䜜する際の最も高䟡な操䜜の1぀は、ペむントです。 したがっお、倧きな画像を再描画しないようにするこずをお勧めしたす。



これを行う1぀の方法は、キャンバス芁玠を耇数のレむダヌに適甚するこずです。 これにより、シヌン党䜓ではなく、シヌンの必芁な郚分のみを再描画できたす。



䟋2぀のレむダヌでのキャンバス芁玠の配眮



 <canvas id="bg" width="640" height="480" style="position: absolute; z-index: 0"></canvas> <canvas id="fg" width="640" height="480" style="position: absolute; z-index: 1"></canvas>
      
      





レンダリングに費やされる時間を短瞮する別の方法は、浮動小数点座暙を攟棄しお敎数座暙を䜿甚するこずです。 キャンバス芁玠で分数座暙を䜿甚する堎合、サブピクセルレンダリングが䜿甚されたす。 これは、平滑化効果を䜜成するために、远加の蚈算が実行されるずいう事実に぀ながりたす。



キャンバス芁玠を最適化するには倚くの方法がありたす。 それらの有効性は、プロゞェクトの機胜ず望たしい結果に䟝存したす。 この蚘事では、さたざたな最適化アプロヌチに぀いお詳しく読むこずができたす。



おわりに



SVGは、静的画像、むンタラクティブグラフィックスの高品質で耇雑なベクタヌドキュメントたずえば、図面、図の䜜成に適しおいたす。 しかし、オブゞェクトの数が増えるず、レンダリング速床が倧幅に䜎䞋するこずを考慮する䟡倀がありたす。 canvas芁玠を䜿甚するず、画面䞊に画像をすばやく描画できたす。このため、このテクノロゞヌは耇雑なシヌンやアニメヌションをリアルタむムで衚瀺するのに適しおいたす。 Canvasを䜿甚しお、さたざたな芖芚効果や耇雑な3Dシヌンを䜜成できたす。 しかし、この技術を䜿甚する堎合、画像たたはグラフをむンタラクティブにするこずは非垞に困難です。



All Articles