- 本ページの趣旨
- 参考URL
- サンプルコード
- 概ねの仕様
- 注意点
- 主要メソッド
- 発生したエラー
「gifler.js」という、gifアニメーションをcanvasに簡単に表示できるJavaScriptライブラリについて、調べたことの備忘録です。
特徴は以下です。
・gifアニメーションを簡単にcanvas上に表示できる
・各フレームの表示時に画面効果を柔軟に持たせられる
・表示することに特化しており、編集や保存機能は単体ではもたない
ソースと動きを見た方がどういったものかはイメージが付きやすいので、以下がサンプルコードです。
htmlファイルとして保存すれば、そのまま動きが見られるはずです。
公式サイトから入手したgifler.min.jsを同一のフォルダに入れておく必要はあります。
単にcanvasに表示したいだけなら、上のコードで言う、「gif.frames(canvas, undefined, true);」で表示すればよいだけ。
GIFの解析や表示処理などの面倒なところはすべてgifler側で何とかしてくれます。
きちんと、と言うより毎フレームごとの描画処理に別の処理を入れたい場合は、Animatorを使うことになると思います。上のコードで言う「animator = anim;」の部分です。
Animatorではstart()・stop()・reset()などのGIFアニメの再生や停止を操作できるメソッドと、onFrame()やonDrawFrame()というGIFアニメを各フレームごとの表示処理をつかさどるメソッドが入っています。
Animatorで特に重要なのはonFrameとonDrawFrameメソッドだと思います。
どちらもGIFアニメーションの毎フレームごとに呼ばれるメソッドで、デフォルトでcanvasにアニメーションを表示する処理が定義されています。
もし毎フレームごとの描画処理を改修したい場合は、これらのメソッドを上書きする必要があります。
onFrameは毎フレーム行う処理の内、現フレームの描画以外の処理が書かれています。また、このメソッドからonDrawFrameメソッドが呼ばれており、onDrawFrameメソッド内で現フレームの描画処理が書かれています。
両メソッドは基本的にGIFアニメーションの毎フレームごとに呼ばれますが、処理に時間が掛かり過ぎてGIFアニメーションのDelayタイムを超えた場合はフレームが飛ばされることがあります。
例えば、1コマあたり150ミリ秒のGIFアニメーションファイルの場合で、2フレーム目の表示処理(onFrame / onDrawFrame)に170ミリ秒が掛かった場合、150ミリ秒を超えているので3フレーム目の表示処理はスキップされ、130ミリ秒待って4フレーム目の表示処理を行います。
単なる表示処理だけなら飛ばされることによる影響はさほどないですが、「最終フレームで明示的にアニメーションを止めたい」などをやろうとしても、その最終フレームの表示処理がスキップされて、2ループ目が始まることがある点に注意が必要です。
onFrameとonDrawFrameにはデフォルトでGIFアニメーションを表示する処理が定義されていると言いましたが、より正しくは、これらのメソッドが未定義の(上書きしていない)状態で、anim.animationInCanvasやgif.framesなどでGIFアニメーションを開始するとデフォルト処理が定義される仕組みになっています。
その前はundefinedなので、デフォルト処理を保持したい場合は一度GIFアニメーションを開始する必要があります。
概要
画像を読み込んでgif型インスタンスを返す。すべてはここから始まる。
戻り値
gif
引数
url:
GIFファイルへのURL。
使用例
概要
対象のcanvasにgifアニメーションを表示する。
戻り値
(無し)
引数
selecter:
GIFを表示したいcanvas要素、あるいはcanvas要素のセレクタ。
使用例
概要
対象のcanvasにgifアニメーションを表示する。onDrawFrame処理(毎フレーム行われている処理)を上書きすることもできる。
戻り値
(無し)
引数
selecter:
GIFを表示したいcanvas要素、あるいはcanvas要素のセレクタ。
onDrawFrame:
描画ごと(1フレームごと)の処理を上書きする。animator型の同名の関数を参照。
(任意)setDimesions:
true の場合、キャンバスの幅/高さは、読み込まれた GIF の寸法に設定される。デフォルトはfalse。「setDimensions」じゃないので注意。
使用例
概要
animatorPromiseを返す。名前の通りPromise型。
戻り値
animatorPromise
引数
(無し)
使用例
概要
Promise型と同じ。resolveでanimatorを返す。より細かい操作をするためならこのanimatorが必要。
戻り値
animator
引数
Promise型と同じ。
使用例
概要
GIFアニメーションを開始する
戻り値
(無し)
引数
(無し)
使用例
概要
GIFアニメーションを停止する
戻り値
(無し)
引数
(無し)
使用例
概要
GIFアニメーションの現在フレームを一番最初に戻す(stop中でも一番最初に戻る)
戻り値
(無し)
引数
(無し)
使用例
概要
GIFアニメーションが実行中かどうかを返す。実行中ならtrue。
戻り値
running(実行中ならtrue)
引数
(無し)
使用例
概要
描画ごと(1フレームごと)の処理。現フレームのcanvasへの表示処理以外を担当。後述のonDrawFrame()メソッドを内包。デフォルト処理は以下。
戻り値
(略)
引数
(略)
使用例
(略)
概要
描画ごと(1フレームごと)の処理。現フレームのcanvasへの表示処理を担当。デフォルト処理は以下。
戻り値
(無し)
引数
ctx:
表示対象のcanvasの2Dコンテキスト。
frame:
表示するGIFファイルの1フレームの情報。何が含まれているかは、animator._frames変数参照。
i:
frame番号が含まれる。最初のフレームの場合は、0。
使用例
animator.animateInCanvas()を参照。
概要
対象のcanvasにgifアニメーションを表示する。事前にonDrawFrame処理、onFrame処理(毎フレーム行われている処理)を上書きして使うためのものではあるものの、そのまま使うこともできる。
戻り値
(無し)
引数
selecter:
GIFを表示したいcanvas要素、あるいはcanvas要素のセレクタ。
(任意)setDimensions:
true の場合、キャンバスの幅/高さは、読み込まれた GIF の寸法に設定される。デフォルトはfalse。
使用例
概要
配列型の変数。GIFファイルの各フレームの情報が格納されている。
各フレーム内で保持しているのは以下の情報。
x / y / width / height / has_local_palette / palette_offset / data_offset / data_length / transparent_index / interlaced / delay / disposal / pixels / buffer
「gifler()」メソッドは内部的にhttpRequestを送ってGIFファイルを読み込んでいるらしいので、CSP設定をしているとCSP違反でうまくGIFファイルが読み込めないことがあります。
CSP違反によるエラーが発生したら、connect-srcにBlob:を追加するなどの対応が必要です。
GIFアニメーションさせながら、別のGIFアニメーションを読み込ませて再生すると前のGIFアニメーションがゴミのように残り、表示がおかしくなります。
いったんanimator.stop()で再生を止めてから新しいGIFファイルを読み込むか、(おそらく)別のgiflerから戻り値を別の変数に格納することで対応可能だと思います。