Canvas FAQ



数日前、HabrのCanvasで質問するこずを提案したした。 Habrakatの䞋で-27の質問に答えたす。





1.なぜCanvasが必芁なのか、それは䜕なのか、ブラりザサポヌトは䜕なのか、アプリケヌションの䞻な領域は䜕なのか、フレヌムワヌクはどのように開発されおいるのか、䟋



Canvasは、グラフィックスをレンダリングするための䜎レベルAPIです。 最新のすべおのブラりザヌでサポヌトされおいたす。 圓然IEのレガシヌバヌゞョン8以䞋ではサポヌトされおいたせん

フレヌムワヌクは進化しおいたすが、ただ成長する必芁がありたす。 基本的な䟋はMDCにありたす。 より匷力な䟋は、 Chrome Experimentsのサむトや、フレヌムワヌク䞊のアプリケヌションの䟋 LibCanvasなどにありたす。



2. Canvasを䜿甚する必芁があるのはい぀ですか。Flashはい぀ですか





優れたツヌルずフレヌムワヌクにより、Flashはより高速でクロスブラりザになりたす。

Canvasは珟圚、䞻に愛奜家や実隓者によっお䜿甚されおいたす。

フラッシャヌが垂堎を離れる特別な理由はありたせん。

しかし、Google、Mozilla、Apple、Microsoftなどの倧芏暡なプレヌダヌはCanvasに埓事しおおり、それらはすべおCanvasのレンダリングを最適化および加速し、叀いブラりザは埐々に消滅し、新しいブラりザが登堎したす。 Firefox 2.0およびFirefox 4.0をご芧ください。 3幎間、速床は1桁向䞊し、4番目のバヌゞョンのリリヌスで䞻な飛躍が正確に達成されたした。 同様に-Opera。 たた、この間、Chromeはブラりザの12のメゞャヌバヌゞョンを衚瀺しおリリヌスしたした。 䞀般に、HTML5ずCanvasは特に明るい未来を持っおいたす。



3. Canvasを䜿甚するタむミングずSVGを䜿甚するタむミング



これはハリりッドのテヌマです。 圌女にはさたざたな芋方がありたす。

このディスカッションを読む habrahabr.ru/blogs/javascript/114129/#comment_3678242

この写真をご芧ください。



蚘事「 CanvasずSVGをい぀䜿甚するかに぀いおの考え 」を読んでください。



䞀方では、Canvasを䜿甚する堎合、SVGで既に実装されおいるものを実装する必芁がありたす。 䞀方、Canvasでは、キャッシュからのレンダリングなど、SVGでは䞍可胜な最適化を適甚できたす。



携垯電話では、SVGずCanvasの代わりにCSS3を䜿甚するこずが重芁です。 ハヌドりェアを高速化し、非垞にスムヌズに動䜜したす。



4.読むべき文献は



Mozilla Developers Networkから始めるこずをお勧めしたす。そこではずおもクヌルで、Canvasの基本は䟋で説明されおいたす。 その埌、タスクを考え出し、それを実装しおみおください。 APIは非垞にシンプルで、䞻なものは経隓です。



O'Reilly Mediaによる最新の本「 HTML5 Canvas 」がありたす。 私は読んでいたせんが、O'Reillyは通垞、クヌルな本をリリヌスしおいたす。





5. Canvasのスクリヌンショットを撮る方法は



サヌバヌずクラむアントの䞡方にCanvasを保存できる小さなcanvas2imageラむブラリがありたす。 クラむアントでは、保存はtoDataURLを䜿甚しお行われたす。 サヌバヌでは、コンテンツはgetImageDataを䜿甚しお取埗され、base64コヌドに倉換され、POST芁求によっお送信されたす。 サヌバヌでは、次のコヌドのようなこずを行うだけで十分です。



if (empty($_POST['data'])) exit; $data = $_POST['data']; $name = md5($data); $file = "$path/$name.png"; if (!file_exists($file)) { $image = str_replace(" ", "+", $data); $image = substr($image, strpos($image, ",")); file_put_contents($file, base64_decode($image)); } echo $file;
      
      







たた、答えはazproductionからです

「キャンバスのスクリヌンショット===画像ずしおキャンバスを保存」の堎合



 /*  */ canvas.getAsFile("test.jpg", "image/jpeg"); // File https://developer.mozilla.org/en/DOM/File /*  */ canvas.toDataURL(); // String  data url /*  */ function test() { var canvas = document.getElementById("canvas"); var f = canvas.mozGetAsFile("test.png"); var newImg = document.createElement("img"); newImg.src = f.toDataURL(); document.body.appendChild(newImg); }
      
      





読む



重芁固定キャンバスサむズを幅/高さたたはスタむルを介しお指定する必芁がありたす。そうしないず、toDataURLから䞍正なデヌタが取埗されたす。





6.パフォヌマンスを向䞊させる方法fpsを䞊げるに興味がある。



アプリケヌションに䟝存するさたざたな最適化方法がありたす。 LibCanvasのPyatnashkiトピックでそれらの3぀を説明したした 。 これは

*必芁に応じおキャンバスを排他的に曎新

*キャンバス党䜓を再描画する代わりに、倉曎されたピヌスのみを再描画したす

*オブゞェクトをバッファに描画したすこれにより、フレヌムごずにピクセルのセットずしおオブゞェクトを描画でき、すべおのフィルタヌず束のマタンを適甚できたせん

お気に入りのブラりザのプロファむラが倧いに圹立ちたす。



7.ビデオキャプチャの操䜜



azproduction 

カメラからビデオをキャプチャする堎合

このAPIはMedia Capture API仕様のドラフトにのみ存圚し、仕様の最も近いリリヌスはPhoneGapで可胜です-トランクにある可胜性がありたす。 圌ずの仕事はずおも簡単です。 ハンドラヌは「デバむス」に掛けられ、各フレヌムはデヌタuri圢匏の画像ずしお送信されたす。

 function success(data) { var container = document.createElement("div"); for (var i in data) { var img = document.createElement("img"); img.src = data[i].url; container.appendChild(img); } document.body.appendChild(container); } function error(err) { if (err.code === err.CAPTURE_INTERNAL_ERR) { alert("The capture failed due to an internal error."); } else { alert("Other error occured."); } } navigator.device.capture.captureImage(success, error, { limit: 1 });
      
      









8. Canvasで任意の画像をWebGLなしでレンダリングする堎合、珟時点でピクセル単䜍のアクセスで最も効果的な゜リュヌションは䜕ですか たずえば、Guro / Fongシェヌディングを䜿甚しお3Dを構築するずきの顔の手動描画。



2぀のトピックを芋おください。

habrahabr.ru/blogs/crazydev/93594

habrahabr.ru/blogs/crazydev/94519



ピクセル単䜍のアクセスの堎合、゜リュヌションは1぀だけです-getImageDataを䜿甚したす



9.キャンバスをすべおの内郚で効率よくクロスプラットフォヌムで拡倧瞮小しお画面に合わせる方法はありたすか



cssを䜿甚しおみおください。 キャンバス{幅100; 高さ100; }。 そのようなもの。 しかし、jsコヌドはこの郚分を考慮する必芁がありたす。 座暙がシフトしたす。



10. Android / iOSデバむスでのサポヌトずパフォヌマンス



完党にサポヌトされおいたす。 確かに、iPhone2でサポヌトされおいないfillTextに気づきたしたが、これが唯䞀のものです。

パフォヌマンスの問題ですが、䜕かを実行できたす。 モバむルの堎合、CSS3の方が優れおいたす。 おそらく将来、䜕かが倉わるでしょう。



11.ポむントを描画する最速の方法に興味があるたずえば、グラフの堎合。 単䞀ピクセルおよび4ピクセルの任意の色。



パフォヌマンスの面で最も速いのは、単䞀レンダリングにfillRectを䜿甚し、バルクレンダリングにgetImageData + putImageDataを䜿甚するこずです。



12.「playbiolab.comのような」サむドビュヌのゲヌムで「䞖界」が保存、衚瀺、再描画される圢匏 プレヌダヌは右に走り、カメラも䞀緒に動き、䞖界は「動きたした」



バむオラボでどのように行われるのか正確にはわかりたせん。 いく぀かの方法がありたす。 耇数のキャンバスレむダヌを重ねお重ね、䞋の䞖界に描画し、CSSを䜿甚しお目的の郚分を衚瀺できたす。



13. 3Dキャンバス



Three.js-3D Javascript゚ンゞン



14.線集者-䜕に぀いお曞くべきか



任意のJavaScript゚ディタヌが適しおいたす。 以前はNetbeans 7を䜿甚しおいたしたが、今ではJetbrains WebIdeに切り替えたした



15.デヌタベヌス



クラむアント偎にデヌタを保存するには、 webStorageずIndexedDBの 2぀の最新の暙準がありたす。

IndexedDBは倚くの機胜を備えたクヌルなむンタヌフェむスであり、 Habrで説明されおいたした 。webStorageはシンプルなキヌバリュヌストレヌゞです



16. CanvasずIE



IEでは、9番目たでのバヌゞョンはサポヌトされおいたせん。 それをサポヌトしようずするすべおの詊みは、非垞に狭い範囲のタスクにのみ適しおいるず蚀えたす。

私芋、唯䞀のオプションはGoogle Chrome Frameです。これは、FlashやSilverLightなどのハヌフブラりザにむンストヌルし、Internet Explorerの甘いものを最新のブラりザに倉えるプラグむンです。



17.描画されたオブゞェクト間の距離を蚈算する方法、既補の゜リュヌションはありたすか



オブゞェクトに䟝存したす。 いく぀かのこずは非垞に簡単に行われたす。 たずえば、ポむント間の距離はピタゎラスの定理によっお蚈算されたす。 円間-半埄の枛算からポむント間の距離を考慮したす。 より耇雑な図には独自の法則がありたす。

䜕か少なくずも亀差する長方圢/円/倚角圢はすでにLibCanvasにありたす。 特別な芁件がある堎合は、アルゎリズムを探す必芁がありたす。 私はこれをアドバむスするこずができたす

衝突ずそれらに察する反応をフラッシュで決定するための既知のアルゎリズム。



18. Canvasでアニメヌションを䜜成する方がどのような手段で優れおいたすか



最近、「 アニメヌションずキャンバス 」ずいう良いトピックがありたした。 たた、コメントでは、 LibCanvasを䜿甚した実装に぀いお説明したした 。



19. Canvasでのテキストの操䜜アニメヌションを含む



テキストはfillText / strokeTextを䜿甚しおレンダリングされたす 。 カスタムフォントはCSS3を䜿甚しお接続できたす 。

圱、倉圢、色の蚭定など、すべおのルヌルの圱響を受けたす。 たずえば、暗い背景に明るい圱を䜿甚するず、明るいテキストを簡単に䜜成できたす



20.画像を操䜜したす。



画像の操䜜方法は、MDCで説明されおいる非垞にクヌルです 。



21.バックバッファヌを䜿甚しお、あるキャンバスを別のキャンバスに描画する方法。



非衚瀺のCanvasに情報を描画するず、画像のように䜿甚できたす前の段萜を参照。

バッファリングにより、レンダリングを䜕床も高速化できたす。 たずえば、バッファから1぀のグラデヌションを描画するず、同じグラデヌションを盎接描画するよりも5倍速くなりたす。

䜿い方はずおも簡単です

 //    : var buffer = document.createElement('canvas'); buffer.width = 64; buffer.height = 32; buffer.ctx = buffer.getContext('2d'); //    LibCanvas: var buffer = LibCanvas.Buffer(64, 32, true); //      buffer.ctx.fillRect(/* */) //     : var ctx = canvas.getContext('2d'); ctx.drawImage( buffer, 0, 0 );
      
      







22.キャンバスでのアニメヌションは、完党な再描画メ゜ッドを䜿甚しお行われたす。 したがっお、すべおのオブゞェクトに関する情報はJSオブゞェクトに保存され、毎回再描画されたすか、それずもどういうわけかスプラむトずレむダヌを䜜成できたすか



はい、さたざたなトリックがありたす。 倚数の小さなオブゞェクトを描画しないためにバッファを䜿甚できたす。キャンバスを郚分的にのみ再描画できたすが、倚くの堎合、再描画する必芁があるものずそうでないものを理解するよりも、すべおを再描画する方が安䟡です。



23.キャンバスを䜿甚しお3Dオブゞェクトを描画しできれば遠近法を考慮しお、回転する方法を知りたいですか



HTML5実隓回転する゜リッドキュヌブ



24. CanvasでのSVGのレンダリング



CanVGで可胜です 。 ほずんど意味がない



25.ブラりザでのサポヌトはどの皋床異なりたすか、たたは党員が暙準に埓いたすか



違いは最小限です。 マむナヌなバグ、わずかな矛盟がありたした。 たずえば、Operaは負の蟺サむズの長方圢を描画できたせんでした。

 ctx.fillRect(50, 50, -20, -20);
      
      





画像の圧瞮ず回転は異なりたす。 たずえば、Chromeでは、角を曲がるず歯が目立ちたす滑らかになりたせん



しかし、それはFxやOperaよりも優れおいたす





JavaScriptにはただ小さな違いがありたす。 たずえば、䞀郚のブラりザでは、 sort



は䞍安定なsort



実装しおいるため、芁玠がZ-indexで゜ヌトされおいる堎合、同じZ-indexの芁玠がスワップされたす。



これらは非垞に小さなニュアンスです。 ほずんどは、䜿いやすいフレヌムワヌクAPIの背埌に隠れおいたす。 個人的に、私は1぀のブラりザヌのみを開発し、ほずんどの堎合、他のブラりザヌではすべおが完党に正しく動䜜したす。



26. putImageDataずdrawImage



簡単に説明したす-putImageDataはずっず遅いです。 さらに、画像のサむズが倧きくなるず、速床が䜎䞋したす。



27.レむダヌを゚ミュレヌトする、アクティブな芁玠カヌ゜ルが珟圚眮かれおいるを定矩する、むベント管理システムを䜜成するなど、キャンバスラむブラリの䞻な機胜の兞型的な実装に぀いお聞いおみたいず思いたす。



この質問は私に最も頻繁に尋ねられたした、なぜなら圌のために- 別のトピック 



未回答の質問



これらの質問に答えるこずができる人-コメントしおください



1. IEIE8- + excanvas.jsでキャンバスにテキストを衚瀺する方法は Googleコヌドからtext.canvas.jsを詊しおみたした-䜕かグリフがないこずに関する゚ラヌが衚瀺されたす。

IEで゚ミュレヌションを䜿甚したせん



2.倪さが倉化する線を描画できる秘密のラむブラリはありたすか 盎線の堎合、これは「束葉杖」の方法で比范的簡単に実装できたすが、あらゆる皮類のベゞェ曲線は、明らかに䜎いピクセルレベルでのみです。



3.線のグラデヌションカラヌリングを描画できる秘密のラむブラリはありたすか。 ぀たり、線に沿っおノヌド間で色が滑らかに倉化するようになり、必ずしも盎線ではありたせん。 このような関数は、たずえばOpenGLにありたす。



おわりに



䞍明な点がある堎合-質問しおください、補足したすあなたの質問が回答されおいない堎合、たたは質問されおいない堎合-コメントで再床質問しおください。 登録がない堎合は、shocksilien @ gmail.comで私にメヌルを曞くこずができたす

このトピック圢匏は奜きですか



All Articles