ZeroTool Workbench

GIF 分解ツール

GIF をコマ分解して PNG / JPG の静止画に変換。選んだフレームを ZIP で一括保存、スプライトシートと JSON 座標も出力。合成済みの完全なフレームをブラウザ内で書き出し。

100% クライアントサイド データはブラウザ外に出ません 無料 · 登録不要

Drop a GIF here, or click to select

You can also paste a copied GIF file with Ctrl/Cmd+V

Animated or static GIF (GIF87a / GIF89a)

詳しいガイドを読む GIF 分解の仕組みと実践:コマを PNG 保存してスプライトシートと JSON を作る

使い方

  1. GIF をドロップするか、クリックして選択します。コピーした GIF ファイルを Ctrl/Cmd+V で貼り付けることもできます。
  2. 情報バーでキャンバスサイズ、フレーム数、再生時間、初回後の繰り返し回数、ファイルサイズを確認します。
  3. 書き出すコマを選びます。初期状態では全フレームが選択済みです。サムネイルのクリックで個別に切り替え、「すべて選択」「選択解除」でまとめて操作できます。「フレーム 1 〜 48、間隔 4」のように入力して「この条件で選択」を押すと、範囲指定や N コマおきの選択ができます。
  4. PNG(透明を保持)か JPG(品質と、透明部分の背景色を指定)を選びます。
  5. 「ZIP をダウンロード」で選択したフレームをまとめて保存します。1 枚だけ欲しいときはサムネイル下のダウンロードアイコンを使います。ファイル名は {元の名前}-frame-001.png の形式です。
  6. スプライトシートを作る場合は列数と間隔を決めて「スプライトシートを作成」を押し、PNG と JSON をダウンロードするか JSON をコピーします。

コマが「完全な画像」で書き出される理由

GIF は完成した画像を重ねて持っているわけではありません。2 コマ目以降は、変化した矩形だけを書き込み、変化のないピクセルを透明にするのが一般的です。さらに各フレームには disposal(処理方法)が付いています。

disposal意味次のコマの開始状態
0 / 1そのまま残すこのコマがキャンバスに残る
2背景に戻すこのコマの矩形を透明にする
3直前の状態に戻すこのコマを描く前のキャンバスに戻す

差分をそのまま取り出すと、穴の空いた断片になってしまいます。このツールは 1 枚のキャンバスを保持したまま各フレームの処理方法を順番に適用し、描画するたびにキャンバスを複製して出力します。そのため書き出した PNG はどれもその瞬間の完全な画像で、サイズもキャンバスに揃うので、12 コマ目と 1 コマ目をピクセル単位で重ねられます。

スプライトシートと JSON

スプライトシートは、選択したフレームを左から右、上から下の順にグリッド状に並べます。セル間の間隔は透明のままです。JSON の例:

{
  "image": "loader-sprite.png",
  "width": 256,
  "height": 64,
  "frameWidth": 64,
  "frameHeight": 64,
  "columns": 4,
  "spacing": 0,
  "frames": [
    { "frame": 1, "x": 0, "y": 0, "w": 64, "h": 64, "duration": 80 },
    { "frame": 2, "x": 64, "y": 0, "w": 64, "h": 64, "duration": 80 }
  ]
}

frame は元の GIF でのフレーム番号なので、どのコマを飛ばしたかがわかります。duration の単位はミリ秒です。

CSS だけで再生したいときは「列数」を選択フレーム数と同じにして 1 行のシートを作り、steps() で切り替えます。

.loader {
  width: 64px;
  height: 64px;
  background: url(loader-sprite.png) 0 0 / auto 64px;
  animation: play 0.32s steps(4) infinite;
}
@keyframes play {
  to { background-position: -256px 0; }
}

よくある使い方

  • リアクション GIF や画面録画から 1 コマだけ静止画で保存し、スライドや不具合報告、サムネイルに使う。
  • GIF をゲーム用スプライトシートに変換して Phaser・PixiJS・Godot・自作の Canvas ループに読み込む。コマの表示時間は JSON に残る。
  • 重い GIF を CSS の steps() アニメーションに置き換える、または必要なコマだけを WebP にする。
  • UI アニメーションをコマ送りで確認し、レイアウトのずれやちらつきが出るフレームを特定する。
  • 長い GIF から N コマおきに抜き出して、絵コンテや一覧用の画像を作る。

ffmpeg との違い

非常に大きなファイルなら ffmpeg が適しています。フレームの合成も正しく行われます。ただし既定の設定では、遅延がバラバラの GIF を固定フレームレートに変換するため、5 コマの GIF から重複した PNG が数十枚出力されることがあります。1 コマ 1 枚にするには -fps_mode passthrough が必要です。

ffmpeg -i input.gif -fps_mode passthrough frame-%03d.png

このページならインストール不要で同じフレームを取り出せて、コマを見ながら選び、スプライトシートと JSON まで一度に作れます。

仕組み

このページはブラウザ標準の画像デコード API を使わず、GIF を自前でデコードしています。WebCodecs の ImageDecoder はすべてのブラウザで使えるわけではなく、各フレームの処理方法も取得できないためです。論理画面記述子、グローバル / ローカルカラーテーブル、グラフィック制御拡張(遅延・処理方法・透明色)、NETSCAPE2.0 のループ回数を読み取り、各フレームの LZW データを展開します。符号長は最小符号長から 12 ビットまで伸び、clear コードで辞書をリセットします。インターレースのフレームは 4 回のパスから行の並びを復元します。途中で切れたファイルでも、切れる直前までにデコードできたピクセルは残ります。デコードは短い区切りで進めるので、大きなファイルでもページが固まらず、進捗が表示されます。

対応範囲

  • フレームは常にキャンバス全体のサイズで書き出します。切り抜きやリサイズは対象外です。リサイズには書き出したフレームを画像圧縮ツールに渡してください。
  • 出力は PNG、JPG、それらの ZIP、PNG のスプライトシートです。WebP への変換は WebP 変換器を使ってください。
  • アニメーション GIF の編集や再作成は対象外で、このツールは分解専用です。
  • サイズ上限:デコード後 5,000 万ピクセル、1,000 フレーム、1 フレームまたはスプライトシートあたり 16,777,216 ピクセル。

関連ツール

  • WebP 変換器 — 書き出した PNG フレームをまとめて WebP に変換。
  • 画像モザイク加工 — 共有する前にコマの一部をぼかしたり黒塗りしたりする。
  • 画像圧縮ツール — 書き出したフレームやスプライトシートを圧縮・リサイズ。

FAQ

書き出されるのは完全な画像ですか?それとも差分だけですか?

完全な画像です。多くの GIF は 2 コマ目以降を差分の矩形だけで保存し、次のコマの前にそれをどう扱うかを disposal(処理方法)で指定しています。このツールは 0/1/2/3 の 4 種類をすべて適用してコマを合成し、ブラウザで再生したときと同じ見た目で書き出します。差分そのものの書き出しは仕様として提供していません。必要な場合はローカルで gifsicle --explode を使ってください。

GIF はアップロードされますか?

されません。ファイルは File API で読み込み、このページの JavaScript がブラウザ内でデコードします。PNG / JPG へのエンコード、ZIP 作成、スプライトシートの合成もすべてローカルで行います。ローカルに保存するのは書き出し設定(形式・JPG 品質・背景色・列数・間隔)だけで、GIF ファイルやフレームのデータは保存しません。

どのくらいの大きさの GIF まで扱えますか?

デコード後 5,000 万ピクセル(幅 × 高さ × フレーム数)、1,000 フレーム、1 フレームおよびスプライトシートは 16,777,216 ピクセル(一辺 16,384 px)までです。フレームは非圧縮でメモリに保持するため、スマートフォンでも処理しきれる範囲に制限しています。480×270 で 385 フレームの GIF なら収まります。それ以上は ffmpeg -i input.gif -fps_mode passthrough frame-%03d.png をローカルで実行してください。

ファイル上の遅延が 0 なのに 100 ms と表示されるのはなぜですか?

主要ブラウザは 10 ms 以下の遅延(GIF の単位は 1/100 秒なので 0 または 1)を 100 ms として再生します。このツールは実際の再生時間を表示・出力するため、スプライトシートの JSON もブラウザでの見た目と一致します。20 ms 以上の遅延はそのままです。

スプライトシートの JSON には何が入っていますか?

画像ファイル名、シートの幅と高さ、1 フレームのサイズ、列数と間隔、そしてフレームごとに元のフレーム番号 frame、座標 x / y、サイズ w / h、表示時間 duration(ミリ秒)です。ゲームエンジン、Canvas のアニメーションループ、CSS キーフレームにそのまま使えます。