画像 へ戻る
GIF 詳細情報 — フレーム数 / delay / disposal / ループ回数を可視化

GIF 詳細情報 — フレーム数 / delay / disposal / ループ回数を可視化

アニメ GIF を解析して、フレーム数、総再生時間、平均 FPS、ループ回数 (Netscape Application Extension)、各フレームの delay (ms) と disposal method、寸法、ローカル / グローバルカラーテーブル、GIF バージョン (87a / 89a) を一覧表示します。各フレームのサムネイル (disposal 合成済み) も表示。GIF 最適化のデバッグ、ファイルサイズが大きい原因の特定 (delay が短すぎる / フレーム数が多すぎる)、ループしない GIF の確認、配信プラットフォームの上限チェックに。複数 GIF 一括対応。すべてブラウザ内で完結。

使い方

アニメ GIF (1 つ以上) をドロップまたは選択します。 ファイルごとに概要 (バージョン / 寸法 / フレーム数 / 総再生時間 / 平均 FPS / ループ回数) が表示されます。 フレーム一覧で各フレームのサムネ、delay (ms)、disposal method、寸法、Local Color Table の有無を確認できます。 最適化の目安: フレーム数が多すぎる、delay が極端に短いなどファイルサイズが膨らむ典型パターンの発見に。

詳細解説

GIF の内部構造が持つ情報の機微性

GIF ファイルの解析が必要になる場面は、Web から取得した GIF のフレーム構成を確認したいとき、自分が作成したアニメーションのファイルサイズを最適化したいとき、スクリーンキャプチャや画面録画を GIF に変換したものを確認するときなどです。

スクリーンキャプチャ由来の GIF には、録画時の画面内容 ——アプリの UI、ファイル名、通知、URL、パスワードフィールドの近傍 ——が各フレームのピクセルデータとして埋め込まれています。GIF のメタ情報を解析するだけという操作に見えても、ファイル自体をサーバーに送信することはデータの外部転送を意味します。

GIF 解析サービスへのアップロードが残すもの

「gif info online」「gif analyzer」で見つかるサービスは、GIF ファイルをサーバーに送信して解析結果を返します。フレーム数・遅延・ループ回数といった情報を得るだけのためにファイルを送信することになります。「解析するだけ」という用途でも、サーバー側には送信されたファイルが到達しています。

社内ツールのデモ GIF、未公開プロダクトのプロトタイプ画面、個人的なスクリーン録画 ——これらを解析目的であっても外部サービスに渡すことは避けるのが妥当です。GIF の構造解析はバイトレベルの処理であり、外部サーバーを介する必要はまったくありません。

gifuct-js によるブラウザ内 GIF パース

このツールは gifuct-js (MIT ライセンス) を使って GIF ファイルをブラウザ内でパースします。gifuct-js は GIF89a の LZW 圧縮データをデコードし、GCE (Graphic Control Extension)、LCT (Local Color Table)、Netscape Application Extension (ループ情報) などの各ブロックを JavaScript オブジェクトとして展開します。各フレームの合成サムネイルは Canvas の putImageData で生成されます。

GIF ファイルのバイト列は FileReader で読み込まれ、そのまま gifuct-js に渡されるだけで外部ネットワークには送信されません。サムネイル合成も Canvas API で完結します。DevTools の Network タブで確認すると、ページ読み込み後はリクエストが一切発生しないことが確認できます。

解析結果から読み取れるファイル最適化のヒント

フレーム数・delay・disposal method の組み合わせからファイルサイズの肥大化原因を特定できます。delay が 10ms (= stored value 1) になっているフレームが多数ある場合、実際には差分が少ないのに全フレームを保存していることがあります。LCT (Local Color Table) を持つフレームが多い場合は色数が増えてサイズが増大します。disposal method 1 (前フレームを保持) を活用することで、背景部分のデータを削減できる可能性があります。これらの解析はすべてブラウザ内で完結し、ファイルは外部に出ません。解析で特定のフレームを取り出して個別に確認・再利用したい場合は gif-frame-extract で PNG / JPEG として書き出せます。

GIF89a 仕様のバイナリレイアウト

GIF89a (CompuServe, 1989) はバイトレベルで以下の順序で並びます。最初の 6 バイトはマジックナンバー GIF89a、次に Logical Screen Descriptor (7 バイト、幅・高さ・GCT (Global Color Table) フラグ・背景色インデックスなど)、続いてオプショナルな GCT (最大 256 × 3 バイト)。その後はブロックの繰り返しで、各ブロックは Extension Introducer (0x21) または Image Separator (0x2C) または Trailer (0x3B) のいずれかから始まります。

Extension には GCE (Graphic Control Extension, ID 0xF9, 各フレームの delay と disposal method を持つ)、Application Extension (ID 0xFF, Netscape 2.0 のループ情報など)、Plain Text Extension、Comment Extension があります。Image Block は Image Descriptor (10 バイト、左上座標・幅・高さ・LCT フラグ) + オプショナルな LCT + LZW Minimum Code Size + Data Sub-blocks の構造。LZW (Lempel-Ziv-Welch, GIF 用の特殊実装) で圧縮された色インデックスを 12-bit までの可変長コードで格納します。gifuct-js はこれらすべてをパースして JavaScript オブジェクトに展開します。

delay 値とブラウザ間の挙動差 — 「ループしない」「再生が速すぎる」の典型原因

GIF の delay は GCE 内に 16-bit 値 (1/100 秒単位、最大 655.35 秒) として格納されます。ここで実装ごとの挙動差が問題になります。Firefox / Safari / Chrome は delay 値 0 または 1 (= 0ms または 10ms) を「ブラウザ既定値 100ms に置き換える」挙動を取っており、これは Internet Explorer 4 時代の互換性のための歴史的振る舞いです。ffmpeg で動画から変換した GIF が「想定より遅く再生される」現象の多くはこれが原因です。

ループ回数 (Netscape 2.0 Application Extension) は 0 が「無限ループ」、1 以上の値が「指定回数だけ再生して停止」を意味します。1 を「1 回ループ = 2 回再生」と解釈するか「1 回再生で終了」と解釈するかでブラウザ間に差があり、これも「ループしない GIF」の典型的な原因の 1 つです。本ツールで Loop count 表示を確認することで、想定挙動とのズレを特定できます。配信先プラットフォームの上限としては、Twitter / X が 15 MB、Discord が 8 MB (Nitro 50 MB)、Slack が 2 MB を目安にしており、これを超えるサイズの GIF は再生せず静止画として扱われるか、自動圧縮されます。サイズ超過が判明した場合は gif-to-mp4 で MP4 に変換すると、同等の見た目を 1/5〜1/10 のサイズで配信できることが多く、プラットフォーム制限を回避できます。

よくある質問

delay の単位は?
GIF89a は 1/100 秒 (10ms) 単位で格納されています。本ツールでは 1/100 秒値を ms に換算 (× 10) して表示します。`5` と書かれていれば 50 ms = 20 FPS 相当です。
disposal method の意味は?
次のフレーム描画前に現在のフレームをどう処理するかの指示です。0 = 未指定、1 = 保持 (前を残す)、2 = 背景に戻す (透明にする)、3 = 前のフレームに戻す (アンドゥ)。背景固定なら 2、レイヤー積み重ねは 1 が一般的。
ループ回数はどこから取得?
Netscape 2.0 の Application Extension ブロックから読み取ります。0 = 無限ループ、1〜65535 = N 回再生。多くの GIF は 0 (無限) ですが、配信プラットフォームで 1 回再生限定にしているケースもあります。
サムネは patch そのもの?
いいえ、disposal を考慮した合成済み画像を表示します。各フレームは前の状態の上に積み重ね or 背景クリア後に重ねるかが disposal に依存するため、フレーム単独の patch ではなく合成後の見た目が一致します。
データはどこかに送信されますか?
いいえ。gifuct-js (MIT) でブラウザ内 parse、Canvas で合成サムネ生成しています。アップロードはありません。

「送らない」を確かめるには

このツールは入力データを外部に送信しません。仕組み・監査手順・運営方針は以下で詳しく説明しています。

類似のツール

画像メタデータビューア

画像メタデータビューア

画像ファイル (JPEG / PNG / WebP / GIF / TIFF / HEIC / AVIF) をドロップして、解像度・ファイルサイズ・MIME・縦横比・ビット深度・カラータイプ・DPI を表示し、EXIF (撮影日時・カメラメーカー / モデル・レンズ・F 値・シャッタースピード・ISO・焦点距離・露出補正・向き)、GPS 座標、ICC カラープロファイル、IPTC、XMP を抽出します。PNG は IHDR / pHYs、JPEG は SOF / JFIF を自前パーサで読み、EXIF 系は exifr (MIT) で解析。読み取り専用で書き換えはせず、画像はサーバーに送信されません。

画像EXIF抽出
アニメ GIF / APNG フレーム抽出 — PNG / JPEG 書き出し

アニメ GIF / APNG フレーム抽出 — PNG / JPEG 書き出し

アニメーション GIF や APNG (アニメ PNG) を 1 フレームずつ画像として書き出します。ブラウザ標準の ImageDecoder API でデコードするので追加ライブラリ不要。フレーム数の確認や、特定フレームをサムネイルにしたい場合、image-resize や image-crop など 1 枚絵向けのツールに渡す前処理にも。出力は PNG (可逆) / JPEG (品質調整可)、全フレームを ZIP でまとめてダウンロードできます。ファイルは外部に送信されず、すべての処理はブラウザ内で完結します。

画像抽出
GIF → MP4 変換 — H.264 でファイルサイズを 1/5 〜 1/10 に

GIF → MP4 変換 — H.264 でファイルサイズを 1/5 〜 1/10 に

アニメ GIF を H.264/AAC の MP4 動画に変換します。GIF はサイズが膨らみがちですが、MP4 (H.264) ならファイルサイズが 1/5 〜 1/10 になり、X (旧 Twitter) や Bluesky、Discord 等の SNS でも自動再生されやすくなります。ffmpeg.wasm はブラウザ内で動くので GIF はサーバーに送信されません。複数ファイル一括処理 + ZIP ダウンロード対応。

動画画像変換
動画 → GIF 変換 — fps / 幅 / カット範囲を指定

動画 → GIF 変換 — fps / 幅 / カット範囲を指定

動画から GIF を作ります。ffmpeg.wasm の palettegen + paletteuse の 2 パス変換で色再現を高めつつ、fps・幅・カット範囲を指定できます。複数ファイル一括処理 + ZIP ダウンロード対応。動画はサーバーに送信されません。

動画画像変換