# GIF解析 — GIFの中身をそのまま読む

コマ、表示時間、パレット、そしてバイトの行き先。

> GIFをブラウザの中で分解します。各コマの表示時間と破棄方法、カラーテーブル、繰り返し回数、そしてファイルサイズがどこへ消えたかの1バイト単位の内訳まで。アップロードは一切ありません。

これはhttps://abox.tools/ja/gif-analyzer/にあるブラウザー用の対話型ツールです。ファイルはそのブラウザーを実行する端末上で処理します。意図した共有や任意の通信機能はページ内で説明します。以下は文章による説明です。利用するにはアドレスを開いてください。

## GIFは**ブラウザー内で処理**されます。処理のためのアップロードはありません。

ファイルを開いて分解するのはお使いのブラウザです。ブロック構造の読み取りも、LZWの展開も、このページに描かれるすべてのコマも、この端末の中で行われます。仮にここの何かが送ろうとしたところで、このページの向こう側にファイルを受け取るサーバーが存在しません。

- ✗ アップロードなし
- ✗ 登録なし
- ✓ オフラインで動作
- ✓ ソース公開
- ✓ ファイルは端末から出ない

## GIFを解析する手順

1. **GIFを選びます。** 選択欄にドラッグするか、手で選んでください。ブラウザがディスクから直接読み、その間に何かがどこかへ送られることはありません。
2. **まず概要を読みます。** キャンバスの大きさ、コマ数、ファイルが主張する再生時間、そして実際に再生される時間です。この最後の2つは思っているよりよく食い違い、その理由は次の節にあります。
3. **目立つところを見ます。** そこに並ぶ一行一行が、あなたのファイルから測った値です。どのブラウザも守らない表示時間、欠けたループブロック、どこからも参照されないカラーテーブル、一部のコマより大きいメタデータ。あなたの意図についての推測はひとつもありません。
4. **バイトの行き先を見ます。** ファイルのすべてのバイトはどれか1つの行に属し、行を足すとファイルになります。その大半が「圧縮された画素」になければ、表の残りがどこにあるかを教えてくれます。
5. **コマを順に見ていきます。** それぞれに表示時間、矩形、破棄方法、サイズが出ます。「各コマ後のキャンバス」と「各コマが保存している分だけ」を切り替えてください。ファイルが最適化されているかは後者でわかります。よくできたGIFはごく小さな矩形を保存し、そうでないGIFは毎回、絵の全体を保存しているからです。
6. **必要ならレポートを持ち出します。** 解析全体をプレーンテキストで。メッセージに貼るにも、ファイルの隣に置いておくにも使えます。すでに画面に出ている内容から、このページの中で組み立てられます。

## 詳しい解説

[GIFの中には本当は何があるのか](https://abox.tools/ja/guides/whats-inside-a-gif/): コマ、待ち時間、後始末の方法、色表の説明。ブラウザがいちばん短い待ち時間を受け付けない理由と、GIFの容量がどこへ消えたのかを突き止める方法。

## 箱の中のほかのツール

- [動画圧縮ツール](https://abox.tools/ja/compress-video/): 容量の上限を指定すると、設定を計算し、結果を実測します。
- [MP4変換ツール](https://abox.tools/ja/convert-to-mp4/): 録画、取り込み、カメラの動画をH.264とAACのMP4に。使える部分はコピーし、必要な部分だけ再エンコードします。
- [動画回転ツール](https://abox.tools/ja/rotate-video/): 右に90度、180度、左に90度。ヘッダーで回転する場合、映像の各フレームはそのまま保たれます。
- [画像→動画変換ツール](https://abox.tools/ja/images-to-video/): 画像の入ったフォルダを、1本の動画に変えます。

## よくある質問

### GIFはどこかにアップロードされますか？

いいえ。ファイルを読み、展開し、描くのはお使いのブラウザで、場所もお手元のハードウェアです。この道具にサーバー側はなく、ページの`Content-Security-Policy`には接続してよいアドレスがすべて書かれていて、そのどれもこのサイトのものではありません。回線を抜いても、GIFの解析はそのまま続きます。

### 表示時間より遅く再生されるのはなぜですか？

どのブラウザも0.02秒未満の表示時間を守らず、代わりに0.1秒そのコマを止めるからです。この規則は1996年のNetscapeに書き込まれました。当時の回る地球儀や「工事中」の看板のためのもので、以後すべてのブラウザに写され、外されたことは一度もありません。 \
\
ですから、全コマが0.01秒と書かれたGIFが毎秒100コマで再生されることはありません。実際は毎秒10コマで、作った側の意図より5倍から10倍遅い速さです。このページはファイルが言う値と実際に起きる値の両方を出し、影響を受けるコマに印を付けます。直すなら、ファイルを作った側で0.01ではなく0.02と書くことです。

### 「破棄」とは何ですか？

あるコマの時間が終わったとき、画面に何を残すかです。アニメーションがきれいに見えるか、尾を引くかを決めるのがこの項目です。 \
\
**そのまま残す**は、次のコマがその上に描くという意味で、コマが不透明で互いを覆う場合はこれが望ましい設定です。**背景まで消す**は、そのコマの矩形を先に消してから描きます。透過が必要な場合はこれで、そうしないと次のコマの透けた部分から前のコマが見えます。**下にあったものを戻す**は、このコマが描く前にそこにあったものを戻します。動かない背景の上を小さな物体が動く映像はこの形で保存されます。そして**未指定**はファイルが何も言わなかった場合で、どの表示ソフトも「そのまま残す」として扱います。

### GIFがこんなに大きいのはなぜですか？

「バイトの行き先」の表が、一般論ではなくあなたのファイルについて答えます。考えられる答えはいくつかしかありません。 \
\
ほとんどが**圧縮された画素**なら、単純に絵の量が多いということです。GIFは各コマを丸ごとの画素として保存し、動き補償も画質のつまみもありません。大きさはおおよそ面積かけるコマ数です。コマを減らす、寸法を小さくする、色数を減らす。手はこの3つだけです。 \
\
大きな割合が**カラーテーブル**なら、コマごとに768バイトのパレットが書かれています。大きな割合が**メタデータ**なら、編集ソフトがXMPパケットを置いていったということで、これは絵に触れずに取り除けます。そして全コマがキャンバス全体を覆っているなら、どの部分が実際に変わったのかをエンコーダーが求めなかったということです。撮影や録画をもとにしたファイルでは、これが大半を占めます。

### 2つのコマ表示は何が違うのですか？

**各コマ後のキャンバス**は、表示ソフトがその瞬間に見せるものです。前のコマが残したものの上に、このコマが描かれた状態です。**各コマが保存している分だけ**は、そのコマのためにファイルが実際に持っている矩形で、下に何も敷かず、それ単体で表示されます。 \
\
面白いのは後者です。GIFは変わった部分だけをコマとして保存できます。ほとんど動かないウィンドウの画面録画が小さく収まるのはそのためです。あなたのファイルのすべてのコマがキャンバス全体なら、その仕事は誰もしていません。アニメーションを見ていてもわからず、保存されている中身を見て初めてわかります。

### コメントやXMPが入っていると出ました。これは何ですか？

絵と一緒に運ばれ、どの表示ソフトも描かないテキストです。コメントブロックはたいてい、そのファイルを書いたソフトの名前です。XMPパケットは画像編集ソフトが自分のしたことを記録するために書くXMLで、編集履歴やソフトのバージョン、ときには作者名まで含まれます。 \
\
このページは両方を省略せずに書き出します。メタデータで面白いのは、あることではなく何が書いてあるかだからです。それが見えるのはあなただけです。このリポジトリの中に、それを誰かに読み上げるものはありません。

### 壊れたGIFでも開けますか？

試してみて、どこで諦めたかを伝えます。ブロックの途中で終わるファイル、ブロック標識のあるべき位置に別のバイトがあるファイル、圧縮データが早く尽きるコマを含むファイルでも、そこまで読めた分はすべて表示し、何が起きたかを冒頭に示します。解析がいちばん必要になるのはまさにその場面なので、バイト1つのために全体を捨てるのは正しい振る舞いではありません。

### ファイルは書き換えられますか？

いいえ。この道具は読むだけです。出力ファイルも、再エンコードも、GIFを書き出すボタンもありません。ダウンロードできるのは解析結果のテキストだけです。元のファイルはディスクの上でそのままです。タブを閉じたらどうなるかという問いへの正直な答えも、これと同じです。

### 無料ですか。アカウントは必要ですか？

無料です。アカウント、ログイン、試用期間はありません。ファイルの読み込みは端末のメモリに依存します。描画は復号した画素が3億個に達するか、このページが所有するバッファの推定量が512MiBに達すると停止します。これはブラウザ全体のメモリ制限ではありません。停止またはキャンセルしても、ヘッダー、バイト内訳、表示時間の解析は利用できます。描画していないコマはヘッダーから説明され、完全な画素使用合計とブラウザ標準のアニメーションプレビューは利用できません。最初の解析と標準のメモリ・キャンバス操作は、呼び出しの途中では中断できません。サイトには広告がありますが、ファイルの情報は広告に渡りません。

### オフラインでも動きますか？

動きます。ページを一度読み込んでから通信を切っても、そのまま使えます。何もアップロードされていないことを示す、いちばん簡単な方法でもあります。解析のためにGIFをどこかへ送っている道具なら、線を抜いた瞬間に止まるからです。

## この主張を確かめる方法

- **処理はこのブラウザー内で行います。** 入力と結果はブラウザー内で処理し、処理コードはそれらを処理用にアップロードしません。Content-Security-Policyは資源と接続先を制限しますが、許可済みの相手はリクエストを受け取れます。内容は検査せず、何も送られないことを単独で証明しません。具体的な操作の要求とソースを比較するか、切断中にローカル操作を完了してください。
- **読み取りは、このリポジトリの4ファイルです。** ファイルの中身を調べるのに、ブラウザのGIFデコーダーは使っていません。あれは「どのバイトがどこへ行ったか」を教えてくれないからです。そこでフォーマットは手で読んでいます。`src/gif.js`がブロックをたどり、`src/lzw.js`が画素を展開し、`src/frames.js`が重ね、`src/budget.js`が部分を足し戻してファイルサイズになるかを確かめます。
- **コメントやメタデータは、あなたにだけ表示されます。** GIFにはコメントブロックや、編集内容を記したXMPパケット、カラープロファイルが入っていることがあり、このページはそのすべてを書き出します。それは目の前の画面に出るだけで、ほかのどこにも行きません。このリポジトリに、それを載せる計測イベントはひとつもなく。 任意のフィードバックはツール識別子、固定回答、固定理由だけを送り、ファイルから読んだメタデータは送りません。
- **Googleが読み込むものと、渡されないもの。** 広告と計測のスクリプトはGoogleから来ています。そのどちらにも、ファイルに関する情報は渡されません。ファイルも、サムネイルも、名前も、サイズも、コマ数も、コメントもです。GIFを読み、展開し、描くコードはすべてこのオリジンから配信され、リポジトリに載っています。
- **寄付ボタンが読み込むものと、渡されないもの。** ヘッダーの「Buy me a coffee」ボタンは、cdnjs.buymeacoffee.comのスクリプトが描き、書体はGoogle Fontsから読み込みます。それはリンク以上のものではありません。訪問を報告することもなく、あなたやあなたのファイルについて渡されるものもありません。押さないかぎり何も起こらず、押した先は他人のサイトです。
- **オフラインで動きます。** 通信を切っても、このページのどの部分もそのまま動きます。これがいちばん単純な証明です。解析のためにGIFを送っている道具なら、線を抜いた瞬間に止まるからです。

**自分で確かめてください。**以上のどれも、鵜呑みにする必要はありません。このページは、リポジトリにあるテンプレートと設定から、誰でも読んで実行できるビルドスクリプトが生成しています。その結果は`dist`ブランチに置いてあるので、配信されているものと、ソースをビルドした結果とを差分で比べられます。 https://github.com/A-Box-of-Tools/website

まず読むとよいのは、Content-Security-Policyについては`config/site.toml`、ファイルをたどるブロック読み取りは`src/gif.js`、展開は`src/lzw.js`、バイトの集計は`src/budget.js`です。どれにもネットワークに触れられる行は一行もありません。
