商品サンプル画像
Piawokl 腰掛け扇風機 腰掛けファン 4WAY 携帯冷風機 ベルトファン 3段階風量調節 静音 瞬間冷却 両手解放 熱中症対策 ハンディ扇風機 ライト アウトドア/工事/屋外作業/旅行用 暑さ対策 (ベルトなし,オレンジ)
商品ページ
Amazon
収益広告(自動登録)
※Amazonレビュー要確認
商品サンプル画像
『ToHeart』プレミアムエディション -Steam 【特典】TVアニメ『ToHeart』Blu-ray Disc(全13話・2枚組)同梱
商品ページ
Amazon
収益広告(手動登録)
商品サンプル画像
コミネ(KOMINE) 00-923 KK-923 ペルチェ素子ウェアラブル ブレインクーラー Black Free
商品ページ
Amazon
収益広告(自動登録)
商品サンプル画像
D.C.Ⅱ.S.S.~ダ・カーポⅡセカンドシーズン~(TV番組)
商品ページ
Amazon
非収益広告(手動登録)
商品サンプル画像
腰掛け冷風扇 腰ベルト扇風機 腰 ファン 腰掛け アウトドア用 4way腰掛けファン 移動の小型エアコン 冷風機 3段階風量調整 静音設計 落下防止 防水 防塵 強力な懐中電灯が 1日中持続稼働できる エアコン級の涼風腰掛けファンベルト付きです 暑さ
商品ページ
Amazon
収益広告(自動登録)
※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件が表示されます
コメント投稿




画面下部の「コンタクト」からも連絡可能です。
管理人ツイート
商品サンプル画像
スッキリわかるJava入門 第3版 (スッキリわかる入門シリーズ)
商品ページ
Amazon
収益広告(手動登録)
商品サンプル画像
ポータブルファン クリップ ミニ 腰掛け ベルト 服につける 軽量 羽なし 静音 ウエスト 小型扇風機 USB充電式 ネックファン 首掛け 背中 ベルトファン クーラー 3段階調節 360°送風調節 ハンディ 携帯 卓上 暑さ対策 アウトドア おしゃ
商品ページ
Amazon
収益広告(自動登録)
※Amazonレビュー要確認
商品サンプル画像
[qiukala]【東京大学研究所の2025年最新の研究開発】4WAY腰掛けファン アウトドア用ポータブル腰装着ファン 腰掛け扇風機 ベルトファン 18850rpm強風/6000mAh大容量 無段階風速調整 熱中症対策 24時間連続稼働 耐衝撃設計
商品ページ
Amazon
収益広告(自動登録)
※Amazonレビュー要確認
商品サンプル画像
アシュリー、魔法はよいこになってから!(全3巻)
商品ページ
Amazon
非収益広告(手動登録)
管理人作品宣伝
【ドラゴンクエストモンスターズ テリーのワンダーランドRETRO】ふじみのワンダーランド-Part01
動画 / 最終更新:2024-06-12
テリワンRETROのプレイ動画です。…テリワンRETROのプレイ動画です。

YouTubeで閲覧するニコニコ動画で閲覧する利用素材等の詳細情報
ChatGPT-アイコンと名前変更
Chrome 拡張機能 / 最終更新:2025-05-29
ChatGPTのアイコン等を自分の好みに変えられます。好きなキャラと話しているような気…ChatGPTのアイコン等を自分の好みに変えられます。好きなキャラと話しているような気分になれるかもしれません。

ChromeWebストアで閲覧する利用素材等の詳細情報
作品一覧はこちら
関連ページ
JavaScriptでアナログ時計とデジタル時計を表示するコード
最終更新日:2025-05-29
概要 最近アナログ時計を使ったので、アナログ時計を表示するJavaScriptコードを載せます。 …
記事を閲覧する
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-03
最終更新日:2025-04-20
概要 three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する方…
記事を閲覧する
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-02
最終更新日:2025-04-15
概要 three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する方…
記事を閲覧する
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-01
最終更新日:2025-04-13
概要 three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する方…
記事を閲覧する
GIF / APNG(アニメーション付きPNG)ファイル解析ページ
最終更新日:2025-03-31
ファイル読込・操作 以下に調べたいファイルを読み込ませてください。 ファイル情報 カラーパレットを…
記事を閲覧する
gifler.js仕様メモ
最終更新日:2025-03-23
本ページの趣旨 「gifler.js」という、gifアニメーションをcanvasに簡単に表示できる…
記事を閲覧する
【プログラミング】実例で分かるかもしれない再帰処理
最終更新日:2024-12-15
本ページは以下動画の台本を書き起こしたものです 解説の趣旨・方向性 皆さん、こんばんは今回はプログ…
記事を閲覧する
SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-公開
最終更新日:2024-12-06
概要 SNSツイートを一元化するためのツールを作成しています(古い記事ですが、こちらのページで紹介…
記事を閲覧する
SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-Python
最終更新日:2024-10-13
概要 概要 SNSのツイートを一元化する際の備忘録というかPythonコードの共有です。 それぞれ…
記事を閲覧する
Windows-PowerShellを使用してのフォルダ内のファイル名を連番にリネームする
最終更新日:2024-10-08
以下PowerShellコードを実行することで、フォルダ内のすべてのファイルのファイル名を「0001…
記事を閲覧する
本サイトのタグ一覧
NovelAIR18VRoidWebサイト作成Webツールととモノ。アークナイツアークナイツ-ステージ攻略日記アズールレーンアズールレーン-日記ウマ娘ギャラリーゲームデビラビローグネットスラング系プログラミングホラーポケットタウン怪談気ままな日記情報技術情報技術-WebAPI知的財産権統合戦略白夜極光本サイトについて魔王スライム様がんばる!漫画
人気記事
ポケットタウン_パズル一覧
最終更新日:2025-05-02
スコア:704.2246 pt
グレーのピースの数 (Number of gray pieces):検索グレーピースの数を入力して、…
記事を閲覧する
メイド・オブ・ザ・デッド-攻略お助け情報
最終更新日:2024-05-01
スコア:541.7103 pt
ネタバレ注意! 本ページは『メイド・オブ・ザ・デッド』の情報を記録しているものです。 攻略の参考に…
記事を閲覧する
剣と魔法と学園モノ。2G - パーティ編成確認ツール
最終更新日:2024-05-09
スコア:193.4948 pt
ツール概要 ととモノ。2Gのパーティ編成を考える際に使うツールです。 あくまでストーリークリアまで…
記事を閲覧する
ゲーム『イカれた狩場の看板娘』の紹介・レビュー
最終更新日:2025-05-01
スコア:139.8403 pt
記事概要 イカれたゲームを紹介するぜ! イカれた狩場の看板娘! 以上だ! ちなみにそんなイカれてな…
記事を閲覧する
アークナイツ-常設商品-理性換算
最終更新日:2024-04-28
スコア:133.2250 pt
概要 "常設商品でお得な商品はどれか"というのを理性に換算して一覧化したものとなります。 絶対的に…
記事を閲覧する
黒バス:キセキの世代級の人たちの技一覧
最終更新日:2024-07-21
スコア:127.4336 pt
黒バスのキセキの世代級の人たちの技一覧です 概要 黒バスのキセキの世代級の人たちの技を記載したもの…
記事を閲覧する
地獄先生ぬ~べ~で好きな切ないエピソード
最終更新日:2025-05-19
スコア:124.0763 pt
概要 初代というべきか、週刊少年ジャンプで連載されていた地獄先生ぬ~べ~の切ないエピソードの中で好…
記事を閲覧する
本サイトについて
最終更新日:2025-06-11
スコア:102.0100 pt
本サイトの概要 概要 個人ブログのようなものです。とくにジャンルはありません。 本サイト内の情報に…
記事を閲覧する
最新記事
htmlタグ混在のテキストをhtmlタグとプレーンテキストで分けるJavaScriptコード
最終更新日:2025-06-20
概要 「よくある質問は a href="/" こ span ち /span ら /a です」 とい…
記事を閲覧する
htmlタグ混在のテキストを1行ずつ左から右へワイプ表示する - JavaScript / CSSコード
最終更新日:2025-06-16
JavaScript全文コード 使い方 以下のJavaScriptとCSSコードを読み込んで、Te…
記事を閲覧する 返礼特典
htmlタグ混在のテキストを1行ずつ左から右へワイプ表示する
最終更新日:2025-06-16
概要 ここでは以下のようにテキストを一行ずつ左から右に表示するJavaScriptコードを載せてい…
記事を閲覧する
本サイトについて
最終更新日:2025-06-11
本サイトの概要 概要 個人ブログのようなものです。とくにジャンルはありません。 本サイト内の情報に…
記事を閲覧する
商品サンプル画像
腰掛け冷風扇 腰ベルト扇風機 腰 ファン 腰掛け アウトドア用 4way腰掛けファン 移動の小型エアコン 落下防止 3段階の風速調整 携帯扇風機 防水 防塵 強力な懐中電灯が 1日中持続稼働できる エアコン級の涼風腰掛けファンベルト付きです 暑さ対策
商品ページ
Amazon
収益広告(自動登録)
※Amazonレビュー要確認