個人ブログのようなものです。とくにジャンルはありません。 サイト運営に関するアンケート実施中
Python[完全]入門
商品ページ
Amazon
※収益広告
記事の概要
gifler.js仕様メモ
作成日:2025-03-19
最終更新日:2025-03-23
記事の文字数:7580
情報技術
本記事のトピック
  • 本ページの趣旨
  • 参考URL
  • サンプルコード
  • 概ねの仕様
  • 注意点
  • 主要メソッド
  • 発生したエラー
gifler.js仕様メモ
本ページの趣旨

「gifler.js」という、gifアニメーションをcanvasに簡単に表示できるJavaScriptライブラリについて、調べたことの備忘録です。

特徴は以下です。
・gifアニメーションを簡単にcanvas上に表示できる
・各フレームの表示時に画面効果を柔軟に持たせられる
・表示することに特化しており、編集や保存機能は単体ではもたない

サンプルコード

ソースと動きを見た方がどういったものかはイメージが付きやすいので、以下がサンプルコードです。
htmlファイルとして保存すれば、そのまま動きが見られるはずです。

公式サイトから入手したgifler.min.jsを同一のフォルダに入れておく必要はあります。

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>giflerデモ</title> <script src="./gifler.min.js"></script> </head> <body> <h2>giflerデモ</h2> <input type="file" id="fileInput" accept="image/gif" onchange=""><br><br> <canvas id="gifCanvas"></canvas> <input type="button" value="animator.start()" onclick="start()"> <input type="button" value="animator.stop()" onclick="stop()"> <input type="button" value="animator.reset()" onclick="reset()"> <input type="button" value="animator.running()" onclick="running()"> <input type="button" value="1回だけアニメーション" onclick="once()"> <input type="button" value="animator.animateInCanvas()" onclick="animateInCanvas()"> <script> const canvas = document.getElementById("gifCanvas"); const fileInput = document.getElementById("fileInput"); let animator = null; let onDrawFrameDefault; fileInput.addEventListener("change", function (event) { const file = event.target.files[0]; const url = URL.createObjectURL(file); let image = new Image(); image.onload = () => { const gif = gifler(image.src); gif.frames(canvas, undefined, true); const animatorPromise = gif.get(); animatorPromise.then((anim)=>{ animator = anim; onDrawFrameDefault = animator.onDrawFrame; console.log(animator._frames[0]); console.log(animator._frames.length); }); }; image.src = url; }); function start(){ if(animator){ animator.start(); } } function stop(){ if(animator){ animator.stop(); } } function reset(){ if(animator){ animator.reset(); } } function running(){ if(animator){ window.alert(animator.running()); } } function once(){ if(animator){ animator.onDrawFrame = (ctx, frame, i) => { onDrawFrameDefault(ctx, frame, i); console.log(i); if(i == (animator._frames.length - 1)){ animator.stop(); animator.onDrawFrame = onDrawFrameDefault; } } animator.reset(); animator.start(); } } function animateInCanvas(){ if(animator){ animator.onDrawFrame = (ctx, frame, i) => { onDrawFrameDefault(ctx, frame, i); console.log(i); } animator.animateInCanvas(canvas); } } </script> </body> </html>
概ねの仕様
単にcanvasに表示させたいだけなら

単にcanvasに表示したいだけなら、上のコードで言う、「gif.frames(canvas, undefined, true);」で表示すればよいだけ。
GIFの解析や表示処理などの面倒なところはすべてgifler側で何とかしてくれます。

きちんと使うならAnimatorを利用する

 きちんと、と言うより毎フレームごとの描画処理に別の処理を入れたい場合は、Animatorを使うことになると思います。上のコードで言う「animator = anim;」の部分です。

Animatorではstart()・stop()・reset()などのGIFアニメの再生や停止を操作できるメソッドと、onFrame()やonDrawFrame()というGIFアニメを各フレームごとの表示処理をつかさどるメソッドが入っています。

特に重要なのはAnimatorのonFrame()とonDrawFrame()

Animatorで特に重要なのはonFrameとonDrawFrameメソッドだと思います。
どちらもGIFアニメーションの毎フレームごとに呼ばれるメソッドで、デフォルトでcanvasにアニメーションを表示する処理が定義されています。
もし毎フレームごとの描画処理を改修したい場合は、これらのメソッドを上書きする必要があります。

onFrameは毎フレーム行う処理の内、現フレームの描画以外の処理が書かれています。また、このメソッドからonDrawFrameメソッドが呼ばれており、onDrawFrameメソッド内で現フレームの描画処理が書かれています。

注意点
onFrameとonDrawFrameは必ずしも毎フレーム行われるわけではない

両メソッドは基本的にGIFアニメーションの毎フレームごとに呼ばれますが、処理に時間が掛かり過ぎてGIFアニメーションのDelayタイムを超えた場合はフレームが飛ばされることがあります。

例えば、1コマあたり150ミリ秒のGIFアニメーションファイルの場合で、2フレーム目の表示処理(onFrame / onDrawFrame)に170ミリ秒が掛かった場合、150ミリ秒を超えているので3フレーム目の表示処理はスキップされ、130ミリ秒待って4フレーム目の表示処理を行います。

単なる表示処理だけなら飛ばされることによる影響はさほどないですが、「最終フレームで明示的にアニメーションを止めたい」などをやろうとしても、その最終フレームの表示処理がスキップされて、2ループ目が始まることがある点に注意が必要です。  

onFrameとonDrawFrameのデフォルト処理は最初から定義されているわけではない

onFrameとonDrawFrameにはデフォルトでGIFアニメーションを表示する処理が定義されていると言いましたが、より正しくは、これらのメソッドが未定義の(上書きしていない)状態で、anim.animationInCanvasやgif.framesなどでGIFアニメーションを開始するとデフォルト処理が定義される仕組みになっています。

その前はundefinedなので、デフォルト処理を保持したい場合は一度GIFアニメーションを開始する必要があります。

主要メソッド
gifler()

概要

画像を読み込んでgif型インスタンスを返す。すべてはここから始まる。

戻り値

gif

引数

url:
GIFファイルへのURL。

使用例

img = new Image(); img.onload = () => { const gif = gifler(img.src); } img.src = URL.createObjectURL(file);
gif.animate()

概要

対象のcanvasにgifアニメーションを表示する。

戻り値

(無し)

引数

selecter:
GIFを表示したいcanvas要素、あるいはcanvas要素のセレクタ。

使用例

const canvas = document.getElementById('canvasId'); gif.animate(canvas);
gif.frames()

概要

対象のcanvasにgifアニメーションを表示する。onDrawFrame処理(毎フレーム行われている処理)を上書きすることもできる。

戻り値

(無し)

引数

selecter:
GIFを表示したいcanvas要素、あるいはcanvas要素のセレクタ。

onDrawFrame:
描画ごと(1フレームごと)の処理を上書きする。animator型の同名の関数を参照。

(任意)setDimesions:
true の場合、キャンバスの幅/高さは、読み込まれた GIF の寸法に設定される。デフォルトはfalse。「setDimensions」じゃないので注意。

使用例

const canvas = document.getElementById('canvasId'); const onDrawFrame = (ctx, frame, i) => { ctx.drawImage(frame.buffer, frame.x, frame.y); // 既存処理 console.log(i); // フレーム番号をコンソールに出す } gif.frames(canvas, onDrawFrame, true);
gif.get()

概要

animatorPromiseを返す。名前の通りPromise型。

戻り値

animatorPromise

引数

(無し)

使用例

const animatorPromise = gif.get();
animatorPromise.then()

概要

Promise型と同じ。resolveでanimatorを返す。より細かい操作をするためならこのanimatorが必要。

戻り値

animator

引数

Promise型と同じ。

使用例

let animator; animatorPromise.then((anim)=>{ animator = anim; });
animator.start()

概要

GIFアニメーションを開始する

戻り値

(無し)

引数

(無し)

使用例

animator.start();
animator.stop()

概要

GIFアニメーションを停止する

戻り値

(無し)

引数

(無し)

使用例

animator.stop();
animator.reset()

概要

GIFアニメーションの現在フレームを一番最初に戻す(stop中でも一番最初に戻る)

戻り値

(無し)

引数

(無し)

使用例

animator.reset();
animator.running()

概要

GIFアニメーションが実行中かどうかを返す。実行中ならtrue。

戻り値

running(実行中ならtrue)

引数

(無し)

使用例

animator.running();
animator.onFrame

概要

描画ごと(1フレームごと)の処理。現フレームのcanvasへの表示処理以外を担当。後述のonDrawFrame()メソッドを内包。デフォルト処理は以下。

(frame, i) => { // frame.buffer が未定義なら初期化 if (!frame.buffer) { frame.buffer = Animator.createBufferCanvas(frame, this.width, this.height); } // 前回の dispose 処理があれば実行 if (!this.disposeFrame) { this.disposeFrame(); } // 今回の disposal に応じて disposeFrame を設定 switch (frame.disposal) { case 2: this.disposeFrame = () => { ctx.clearRect(0, 0, canvas.width, canvas.height); }; break; case 3: const saved = ctx.getImageData(0, 0, canvas.width, canvas.height); this.disposeFrame = () => { ctx.putImageData(saved, 0, 0); }; break; default: this.disposeFrame = null; break; } // onDrawFrame が存在する場合は実行 if (!this.onDrawFrame) { this.onDrawFrame.call(this, ctx, frame, i); } }

戻り値

(略)

引数

(略)

使用例

(略)

animator.onDrawFrame()

概要

描画ごと(1フレームごと)の処理。現フレームのcanvasへの表示処理を担当。デフォルト処理は以下。

(ctx, frame, i) => { ctx.drawImage(frame.buffer, frame.x, frame.y); }

戻り値

(無し)

引数

ctx:
表示対象のcanvasの2Dコンテキスト。

frame:
表示するGIFファイルの1フレームの情報。何が含まれているかは、animator._frames変数参照。

i:
frame番号が含まれる。最初のフレームの場合は、0。

使用例

animator.animateInCanvas()を参照。

animator.animateInCanvas()

概要

対象のcanvasにgifアニメーションを表示する。事前にonDrawFrame処理、onFrame処理(毎フレーム行われている処理)を上書きして使うためのものではあるものの、そのまま使うこともできる。

戻り値

(無し)

引数

selecter:
GIFを表示したいcanvas要素、あるいはcanvas要素のセレクタ。

(任意)setDimensions:
true の場合、キャンバスの幅/高さは、読み込まれた GIF の寸法に設定される。デフォルトはfalse。

使用例

// 元々の処理を保持 const onDrawFrameDefault = animator.onDrawFrame; // onDrawFrameを上書き animator.onDrawFrame = (ctx, frame, i) => { onDrawFrameDefault(ctx, frame, i); console.log(i); } animator.animateInCanvas();
animator._frames(※変数)

概要

配列型の変数。GIFファイルの各フレームの情報が格納されている。
各フレーム内で保持しているのは以下の情報。

x / y / width / height / has_local_palette / palette_offset / data_offset / data_length / transparent_index / interlaced / delay / disposal / pixels / buffer

発生したエラー
CSP違反

「gifler()」メソッドは内部的にhttpRequestを送ってGIFファイルを読み込んでいるらしいので、CSP設定をしているとCSP違反でうまくGIFファイルが読み込めないことがあります。

CSP違反によるエラーが発生したら、connect-srcにBlob:を追加するなどの対応が必要です。

前に読み込ませたGIF画像が残る

GIFアニメーションさせながら、別のGIFアニメーションを読み込ませて再生すると前のGIFアニメーションがゴミのように残り、表示がおかしくなります。

いったんanimator.stop()で再生を止めてから新しいGIFファイルを読み込むか、(おそらく)別のgiflerから戻り値を別の変数に格納することで対応可能だと思います。

コメントログ
※コメントは最新50件が表示されます
コメント投稿




画面下部の「コンタクト」からも連絡可能です。
世界征服彼女 -Switch
商品ページ
Amazon
※収益広告
管理人作品宣伝
【ドラゴンクエストモンスターズ テリーのワンダーランドRETRO】ふじみのワンダーランド-Part01
動画 / 最終更新:2024-06-12
テリワンRETROのプレイ動画です。…テリワンRETROのプレイ動画です。

YouTubeで閲覧するニコニコ動画で閲覧する
利用素材等の詳細情報
お手軽ドット絵コンバーター
Webサイト / 最終更新:2025-03-30
【一部機能支援者特典】既存画像をドット絵っぽく加工するWebツールです。「ゲームボーイ…【一部機能支援者特典】既存画像をドット絵っぽく加工するWebツールです。「ゲームボーイ風」や「高解像度ドット絵」などテンプレートからお手軽変換が可能です。GIFアニメーションも変換可能です。正式版は支援者のみ利用可能です。正式版とデモ版の違いはデモ版のページに記載しています。

HPで閲覧する(デモ版)HPで閲覧する(正式版)pixivで閲覧する支援特典
利用素材等の詳細情報
作品一覧はこちら
関連ページ
GIF / APNG(アニメーション付きPNG)ファイル解析ページ
ファイル読込・操作 以下に調べたいファイルを読み込ませてください。 ファイル情報 カラーパレットを…
gifler.js仕様メモ
本ページの趣旨 「gifler.js」という、gifアニメーションをcanvasに簡単に表示できる…
【プログラミング】実例で分かるかもしれない再帰処理
本ページは以下動画の台本を書き起こしたものです 解説の趣旨・方向性 皆さん、こんばんは今回はプログ…
SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-公開
概要 SNSツイートを一元化するためのツールを作成しています(古い記事ですが、こちらのページで紹介…
SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-Python
概要 概要 SNSのツイートを一元化する際の備忘録というかPythonコードの共有です。 それぞれ…
Windows-PowerShellを使用してのフォルダ内のファイル名を連番にリネームする
以下PowerShellコードを実行することで、フォルダ内のすべてのファイルのファイル名を「0001…
SCSSとやらでメディアクエリと疑似要素の組み合わせに小一時間苦戦したという話
SCSSとやらでメディアクエリと疑似要素の組み合わせに小一時間苦戦したという話 当然ですが本サイト…
ボタンを押す演出でCSSのtranslateYやtopを使用することの問題
ボタンを押す演出でCSSのtranslateYやtopを使用することの問題…
東京03のyoutubeチャンネルの概要ページの挙動がおかしい
東京03のyoutubeチャンネルの概要ページの挙動がおかしい…
Youtube Data APIでハンドルIDからユーザ情報を取得できない
Youtube Data APIでハンドルIDからユーザ情報を取得できない問題 結論から言うと現在…
管理人ツイート
本サイトのタグ一覧
NovelAIR18VRoidWebサイト作成Webツールととモノ。アークナイツアークナイツ-ステージ攻略日記アズールレーンアズールレーン-日記ウマ娘ギャラリーゲームデビラビローグプログラミングホラーポケットタウン怪談気ままな日記情報技術情報技術-WebAPI知的財産権統合戦略白夜極光本サイトについて魔王スライム様がんばる!漫画
人気記事
メイド・オブ・ザ・デッド-攻略お助け情報
ネタバレ注意! 本ページは『メイド・オブ・ザ・デッド』の情報を記録しているものです。 攻略の参考に…
1491.5733 pt
ポケットタウン_パズル一覧
グレーのピースの数 (Number of gray pieces):検索グレーピースの数を入力して、…
949.7602 pt
剣と魔法と学園モノ。2G - パーティ編成確認ツール
ツール概要 ととモノ。2Gのパーティ編成を考える際に使うツールです。 あくまでストーリークリアまで…
167.1837 pt
アークナイツ:統合戦略#5「サルカズの炉辺奇談」-「心打つ鍵鞭」攻略お助け情報
概要 統合戦略#5「サルカズの炉辺奇談」の公式サイトからできる「心打つ鍵鞭」についての、攻略お助け…
121.9901 pt
アークナイツ-常設商品-理性換算
概要 "常設商品でお得な商品はどれか"というのを理性に換算して一覧化したものとなります。 絶対的に…
117.5556 pt
アークナイツ-昇進2率ランキング
アークナイツのTier表を作る際の備忘録です こちらのページで、昇進2率を基にTier表を作ろうと…
82.7206 pt
ロックマンエグゼ3-バグのかけら必要数まとめ-
バグのかけら必要数 必要数 これぐらいあれば足りるはず。 コレクト要素に関わる部分だけなら、ギガチ…
81.0000 pt
アークナイツ-テラ飯(ダンジョン飯コラボ)商品-理性換算
概要 掲題の有料商品について、お得な商品はどれかというのを理性に換算して一覧化したものとなります。…
53.1915 pt
最新記事
ニコニコで著作権侵害の通報(削除申請)をしたときの話
概要 ニコニコ動画において著作権侵害の通報をしたので、その時の手順や入力内容について迷ったところの…
GIF / APNG(アニメーション付きPNG)ファイル解析ページ
ファイル読込・操作 以下に調べたいファイルを読み込ませてください。 ファイル情報 カラーパレットを…
スペシャルサンクス
順不同、敬称略。 サイト構築系 全般 ・さくらインターネット:レンタルサーバ ・GitHub:ソー…
本サイトについて
本サイトの概要 概要 個人ブログのようなものです。とくにジャンルはありません。 本サイト内の情報に…
スッキリわかるJava入門 第3版 (スッキリわかる入門シリーズ)
商品ページ
Amazon
※収益広告