キャンバスのより楽しい機能の1つは、画像を使用できることです。これらを使用して、動的な写真を合成するために使用するか、グラフなどの背景として使用できます。現在、テキストを追加する唯一の方法でもあります(仕様にはテキストを描画する関数は含まれていません)。外部画像は、Gecko(PNG、GIF、またはJPEG形式など)でサポートされているあらゆる形式で使用できます。同じページの他のキャンバス要素もソースとして使用できます。
キャンバスの興味深い機能の1つは、画像の合成やバックグラウンド制作などに使用できる画像を導入できることです。現在、テキストのみが画像に追加できます(標準の説明にはテキストの描画機能は含まれません)。 Gecko(PNG、GIF、JPEGなどなど)でサポートされている画像をキャンバスに導入できる限り、他のキャンバス要素も画像のソースとして使用できます。
画像のインポートは、基本的に2段階のプロセスです。
画像を導入するには、2つの簡単な手順のみが必要です。
最初にステップ1を見てみましょう。基本的に利用可能な4つのオプションがあります。
最初のステップを見てみましょう。基本的に4つのオプションがあります。
document.imagesコレクション、document.getelementsbytagnameメソッドのいずれかを使用して、ページ上のすべての画像にアクセスできます。
document.imagesコレクション、document.getelementsbytagnameメソッド、またはdocument.getElementbyIDメソッドを使用して、ページに画像を取得できます(画像要素のIDがわかっている場合)。
通常の画像と同様に、document.getElementsByTagnameメソッドまたはdocument.getElementByIDメソッドのいずれかを使用して、他のキャンバス要素にアクセスします。ターゲットキャンバスで使用する前に、ソースキャンバスに何かを描いていることを確認してください。
参照ページの画像と同様に、document.getElementsByTagnameまたはdocument.getElementByIDメソッドを使用して、他のキャンバス要素を取得します。しかし、紹介すべきのは、準備が整ったキャンバスです。
これのより実用的な用途の1つは、他の大きなキャンバスのサムネイルビューとして2番目のキャンバス要素を使用することです。
一般的なアプリケーションは、別の大きなキャンバスのためにサムネイルを作ることです。
<別のオプションは、スクリプトに新しい画像オブジェクトを作成することです。このアプローチの主な障害は、画像がロードされるのを待つ必要があるためにスクリプトを中央で停止させたくない場合、何らかの形の画像プリロードが必要であることです。
さらに、スクリプトを使用して新しい画像オブジェクトを作成できますが、この方法の主な欠点は、画像デバイスを待つためにスクリプトを一時停止したくない場合は、プリロードを突破する必要があることです。
基本的に新しい画像オブジェクトを作成するには、これを行います。
次の簡単な方法で画像を作成できます。
var img = new Image(); //新しい画像Objectimg.src = 'myimage.png'; //ソースパスを設定します
このスクリプトが実行されると、画像は読み込み開始します。 DrawImageステートメントが実行されたときにロードが終了しない場合、画像が終了しているまでスクリプトが停止します。これを起こさせたくない場合は、オンロードイベントハンドラーを使用してください。
スクリプトが実行されると、画像が読み込まれ始めます。 DrawImageを呼び出すときに画像がロードされていない場合、スクリプトはロードされるまで待機します。これが必要ない場合は、オンロードイベントを使用できます。
var img = new Image(); //新しい画像Objectimg.onload = function(){//ここでdrawimageステートメントを実行} img.src = 'myimage.png'; //ソースパスを設定します外部画像を1つだけ使用している場合、これは良いアプローチになる可能性がありますが、複数の追跡を必要とすると、もっとunningなものに頼る必要があります。このチュートリアルの範囲を超えて、画像のプリロード戦術を見ることができますが、完全なソリューションについてはJavaScript Image Preloaderをチェックできます。
1つの写真しか使用していない場合、それで十分です。ただし、複数の画像が必要になると、より複雑な処理方法が必要ですが、画像プリロード戦略はこのチュートリアルの範囲を超えています。興味がある場合は、JavaScript Image Preloaderを参照できます。
画像を含める別の可能な方法は、データを介してです:url。データURLを使用すると、コード内で画像をBase64エンコードされた文字列の文字列として直接定義できます。データURLの利点の1つは、結果の画像がサーバーへの別の往復旅行なしですぐに利用できることです。 (もう1つの利点は、1つのファイルにCSS、JavaScript、HTML、および画像のすべてをカプセル化することが可能であることです。他の場所により携帯することができます。)この方法のいくつかの欠点は、画像がキャッシュされていないことです。
データを介して画像を参照することもできます:URLメソッド。データURLを使用すると、base64エンコード文字列の文字列で画像を定義できます。利点は、サーバーを再び回避することなく、画像コンテンツがすぐに利用できることです。 (そして、もう1つの利点は、CSS、JavaScript、HTML、および画像を一緒にカプセル化できることです。これは、移行するのに非常に便利です。)不利な点は、画像をキャッシュできないことです。画像が大きい場合、埋め込まれたURLデータは非常に長くなります。
var img_src = 'data:image/gif; base64、r0lgodlhcwalaaaaaaaaaaa3pn/zih5baeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiuha+hkcuo4lmnvindo7qyrixigbyaow =';
ソースイメージオブジェクトを参照したら、DrawImageメソッドを使用してキャンバスにレンダリングできます。後で見ると、DrawImageメソッドが過負荷になり、3つの異なるバリエーションがあります。最も基本的な形では、このように見えます。
ソースグラフオブジェクトが取得されると、DrawImageメソッドを使用してキャンバスにレンダリングできます。ドローイメージ法には3つの形式があり、以下が最も基本的な方法です。
drawimage (画像、x、y)画像は、画像またはキャンバスオブジェクトへの参照です。 xとyは、画像を配置する必要があるターゲットキャンバスの座標を形成します。
イメージは画像またはキャンバスオブジェクトであり、xとyはターゲットキャンバスの開始座標です。
次の例では、小さな線グラフの背景として外部画像を使用します。背景を使用すると、精巧な背景を描く必要がないため、スクリプトをかなり小さくすることができます。ここでは1つの画像のみを使用しているため、画像オブジェクトのオンロードイベントハンドラーを使用して、図面ステートメントを実行します。ドローイメージメソッドは、キャンバスの左上隅である座標(0,0)に背景を配置します。
次の例では、外部画像を線形画像の背景として使用します。背景画像で責任ある背景を描画したり、多くのコードを保存する必要はありません。ここでは1つの画像オブジェクトのみが使用されるため、オンロードイベント応答関数で描画アクションがトリガーされます。 DrawImageメソッドは、背景画像をキャンバスの左上隅(0,0)に配置します。
functiondraw(){
function draw(){var ctx = document.getElementById( 'canvas')。getContext( '2d'); var img = new Image(); img.onload = function(){ctx.drawimage(img、0,0); ctx.beginpath(); ctx.moveto(30,96); ctx.lineto(70,66); ctx.lineto(103,76); ctx.lineto(170,15); ctx.stroke(); } img.src = 'images/backdrop.png'; }DrawImageメソッドの2番目のバリアントは、2つの新しいパラメーターを追加し、キャンバスにスケーリングされた画像を配置できます。
DrawImageメソッドのもう1つのバリアントは、キャンバスで拡張する画像を制御するための2つのパラメーターを追加することです。
drawimage (画像、x、y、幅、高さ)幅と高さは、ターゲットキャンバスの画像のサイズです。
この例では、画像を壁紙として使用し、キャンバスで数回繰り返します。これは、スケーリングされた画像を異なる位置にループして配置するだけで行われます。行のループの最初のコードでは、列のループの2番目のコード。画像は、50x38ピクセルの元のサイズの3分の1をスケーリングされています。このチュートリアルの後半で、カスタムパターンを作成することにより、これがどのように達成されたかを確認します。
この例では、画像を使用して、背景のような繰り返しの方法でキャンバスに広がります。また、実装するのは非常に簡単で、ズームした写真をループするだけです。以下のコードを参照してください。 for loopの最初の層は行を繰り返すことであり、2番目の層は列を繰り返すことです。画像サイズは、元の3分の1の50x38 pxにスケーリングされます。この方法は、次のチュートリアルでわかるように、背景パターンの効果を適切に実現するために使用できます。
注:拡大しすぎると、画像が拡大したり粒子が粗すぎたりすると、画像がぼやけることがあります。スケーリングは、読みやすいままである必要があるテキストが含まれている場合、おそらく最善ではありません。注:大規模なスケーリングのために、画像が不明瞭になったりぼやけたりする場合があります。画像にテキストがある場合、スケーリングしないことが最善です。なぜなら、それを処理した後、画像内のテキストが認識できなくなる可能性が非常に高いからです。
functiondraw(){
function draw(){var ctx = document.getElementById( 'canvas')。getContext( '2d'); var img = new Image(); img.onload = function(){for(i = 0; i <4; i ++){for(j = 0; j <3; j ++){ctx.drawimage(img、j*50、i*38,50,38); }}} img.src = 'images/rhino.jpg'; }DrawImageメソッドの3番目と最後のバリアントには、8つの新しいパラメーターがあります。この方法を使用して、ソース画像の一部をスライスし、キャンバスに描画できます。
DrawImageメソッドの3番目と最後のバリアントには、スライスの表示を制御する8つの新しいパラメーターがあります。
drawimage (画像、sx、sy、swidth、sheight、dx、dy、dwidth、dheight)最初のパラメーター画像は、他のバリアントと同様に、画像オブジェクトへの参照または異なるキャンバス要素への参照です。他の8つのパラメーターについては、右側の画像を見るのが最善です。最初の4つのパラメーターは、ソース画像のスライスの位置とサイズを定義します。最後の4つのパラメーターは、宛先キャンバスの位置とサイズを定義します。
最初のパラメーターは他のパラメーターと同じであり、どちらも1つの画像または別のキャンバスへの参照です。他の8つのパラメーターは、右側の図に最もよく言及されています。最初の4は、画像ソースのスライス位置とサイズを定義し、最後の4はスライスのターゲット表示位置とサイズを定義します。
スライスは、構成を作りたいときに便利なツールになる可能性があります。すべての要素を単一の画像ファイルに配置し、この方法を使用して完全な図面を組み合わせることができます。たとえば、チャートを作成したい場合は、単一のファイルに必要なすべてのテキストを含むPNG画像を使用でき、データに応じてチャートのスケールをあまり困難なく変更できます。別の利点は、すべての画像を個別にロードする必要がないことです。
スライスは、画像合成のための強力なツールです。すべての要素を含む画像があるとし、この方法を使用して完全な画像を合成できます。たとえば、チャートを描画し、必要なテキストをすべて手に入れたPNGファイルを使用する場合は、実際のデータニーズに応じて最終的な表示チャートを簡単に変更できます。この方法のもう1つの利点は、各画像を個別にロードする必要がないことです。
この例では、上で見たのと同じサイを使用しますが、今はその頭をスライスして額縁に合わせます。額縁の画像には、24ビットPNG画像として保存されているドロップシャドウが含まれています。 24ビットのPNG画像には、GIFや8ビットのPNG画像とは異なり、完全な8ビットアルファチャネルが含まれているため、任意の背景に配置することができ、マット色を心配する必要はありません。
この例では、上で使用したサイの画像を使用しましたが、今回はサイの頭のスライスをクローズアップし、それをフォトフレームに合成しました。フレームには影の効果があり、24ビットPNG形式で保存された画像です。 24ビットのPNG画像には、GIFや8ビットPNGとは異なり、完全な8ビットアルファチャネルが付属しているため、根底にある色を心配することなく背景として置くことができます。
上記の例とは異なるアプローチを画像の読み込みに取りました。画像をHTMLドキュメントに直接配置し、CSSルールを使用して表示から表示しました(表示:なし)。両方の画像をID属性を割り当てて、選択しやすくしました。スクリプト自体は非常に簡単です。最初にキャンバスにスライスされたスケーリングされた画像を描画し(最初のドローイメージステートメント)、次にフレームを上に配置します(2番目のドローイメージステートメント)。
上記の画像とは異なる方法でロードし、HTMLに画像を直接挿入してから、CSSを介して非表示にします(表示:なし)。両方の画像にIDを割り当てましたが、これは後で使用するのに便利です。以下のスクリプトを見ると、非常に簡単です。まず、サイの頭(最初のドローイメージ)をスライスし、キャンバスに置き、次にフォトフレームを置きます(2番目のドローイメージ)。
function draw(){var canvas = document.getElementById( 'canvas'); var ctx = canvas.getContext( '2d'); //スライスctx.drawimage(document.getElementbyId( 'source')、33,71,104,124,21,20,87,104)を描画します。 //フレームctx.drawimage(document.getElementbyId( 'frame')、0,0);}を描くこの章の最後の例では、私は小さなアートギャラリーを作りました。ギャラリーは、いくつかの画像を含むテーブルで構成されています。ページが読み込まれると、ページの各画像について、キャンバス要素が挿入され、その周りにフレームが描かれます。
私の場合、すべての画像には固定幅と高さがあり、その周りに描かれたフレームも同様です。スクリプトを強化して、画像の幅と高さを使用して、フレームを完全に周囲にフィットさせることができます。
以下のコードは自明である必要があります。画像配列をループし、それに応じて新しいキャンバス要素を追加します。おそらく、DOMにそれほど精通していない人にとって、おそらく注意すべき唯一のことは、挿入前の方法の使用です。 insertBeforeは、新しいノード(キャンバス要素)を挿入する前に、要素(画像)の親ノード(テーブルセル)のメソッドです。