今回はHTML5のCanvasエレメントで波紋が動くエフェクトを作る実験だ。
Canvas Wave
Show me
/ Download
このデモでは、画像の適当な場所をクリックすると、そこを中心に波状のエフェクトアニメーションが動き出す。
CPUパワーを使いすぎないように描画間隔を調整しているので、処理が重すぎてハングアップすることはない。はず。
処理の流れ
まず、Canvasの画像をgetImageDataでImageDataオブジェクトに変換して、そのピクセルを直接いじって特殊効果をかけている。
効果をかけたImageDataをputImageDataでCanvasに書き戻す。
これをタイマーで適当に間隔をあけて繰り返すと、このサンプルのようなエフェクトができる。
フレームごとに400*267のピクセルを全部書き換えており、さらに1ピクセルごとに三角関数や平方根の計算をしたらどのくらいのスピードになるか。という、ベンチマークのために作ってみた。
Chrome 4.1: ○
FireFox 3.6.2: ○
Opera 10.51: ○
Safari 4.0.5: ○
上記の「モダンな」ブラウザでは問題なく動作する。
自前で直接ImageDataのピクセルを操作しているので、どのブラウザでも挙動に違いはない。
ただし、動作速度の違いがフレームレートに現れる。現状ではChromeが最も速く、滑らかなアニメーションになる。
IE 8.0: ×
IEは完全に非対応。現状のExplorerCanvasはgetImageData/putImageDataをサポートしていないので動かしようがない。ExplorerCanvasが使っているVMLには該当する機能がないようなので、今後もサポートされる見込みは薄い。
今回のまとめ
というわけで、CanvasのImageDataを使って直接ピクセルをいじって描画すると、互換性はあまり気にならない。
各ブラウザでJavaScriptの速度が向上しているので、アニメーションを行っても十分に実用的なフレームレートが出せる。
パフォーマンスでは専用ハードウェアを活用したバイナリコードに及ばないけれど、理屈の上では3Dだろうが動画のデコードだろうがなんでもできる可能性がある。
ただし、IEは完全に蚊帳の外だ。残念ながら、IE9でさえCanvasをサポートしないので動かせない。
現状でWebサービスでIEを除外するのは現実的ではないので、「あってもなくても困らないエフェクト」くらいしか使えない気はする。
しかし、ImageDataは表現の幅を飛躍的に高める可能性を秘めているので、捨てるにはもったいなすぎる。もっと面白い使い道を考えていきたい。