GIFが保存できるものと、大きくなる理由
GIFのフレームはパレット番号の格子で、LZW圧縮前は1画素1バイト、カラーテーブルは最大256色です。GIF89aの仕様では画像ごとにローカルカラーテーブルを持てます。Nerulioは各フレームの色からそのフレーム専用のパレットを作るので、場面が変わっても前の場面と色を分け合う必要がありません。
動画には256色よりはるかに多くの色があるため、空・肌・影のような滑らかなグラデーションは帯状に分かれます。ディザリング50 %や100 %は、フロイド–スタインバーグ法で丸め誤差を拡散し、帯を細かい粒に変えます。粒はLZW圧縮にとってノイズなので、ディザリングしたGIFは大きくなります。色数を減らす(128・64・32)とファイルは小さくなり、帯は目立ちます。
GIFには音声も、動画コーデックのような動きの圧縮もないため、全フレームの全画素の分だけ大きくなります。表示時間は1/100秒単位なので15fps(66.7ms)はそのまま保存できず、Nerulioは70msと60msを交互に使って平均を合わせます。速度は表示時間ではなく、取り出す瞬間を変えます。2倍速なら滑らかさはそのままで長さが半分になります。
- パレット(カラーテーブル)
- 1フレームで使える最大256色。各画素はその中の番号を持ちます。
- ディザリング
- パレットにない色を表すため、近くのパレット色を模様のように混ぜること。
- フレームの遅延
- フレームが表示される時間。100分の1秒単位で保存されます。
例:1920 × 1080の動画6秒を既定の設定で
GIFの既定の区間は最初の6秒です。
フレームサイズ 480 × 270 px = 129,600画素
フレーム数 6 s × 15 fps = 90フレーム
遅延 70, 60, 70, 70, 60, 70 … ms (3フレーム = 200 ms)
番号データ 129,600 × 90 = LZW圧縮前で1,170万バイト
24 fpsなら 144フレーム、遅延40, 40, 50 … ms、番号データ1,870万バイト
640 pxなら 640 × 360 × 90 = 番号データ2,070万バイト
その後LZWが番号データをどれだけ縮めるかは絵によって違うため、予想容量は推測ではなく、実際のクリップのフレーム3枚をエンコードして計算します。2倍速なら同じ6秒が45フレーム、3秒のGIFになります。
設定と容量への影響
| 設定 | 選択肢 | 容量への影響 |
|---|
| 幅 | 320・480・640 pxまたは元のまま | 1フレームの画素数は幅の2乗で増える |
|---|
| フレームレート | 10・15・24 fps | フレーム数が比例して増える |
|---|
| 色数(詳細) | 256・128・64・32 | 色が少ないほど圧縮が効くが、帯が増える |
|---|
| ディザリング(詳細) | オフ・50 %・100 % | グラデーションが滑らかになり、ファイルは大きくなる |
|---|
| 速度 | 0.5倍・1倍・2倍 | 2倍ならフレーム数と長さが半分 |
|---|
| 切り抜き | なし・1:1・4:5・16:9、中央基準 | 1フレームの画素数が減る |
|---|
| 目標容量(MB) | 任意の値 | サイズを測りながら最大4回エンコード |
|---|
結果の確認
- 実行前に、要約にフレーム数と、実際にエンコードしたフレーム3枚から測った予想容量が出ます。
- 実行後、結果の欄に幅 × 高さ、フレーム数、容量と、目標があれば達成したかが出ます。
- GIFをブラウザと投稿先のアプリで開き、ループするか(ループをオフにしたなら1回で止まるか)確認します。
トラブルシューティング
| 症状 | 考えられる原因 | 確認方法 | 対処 |
|---|
| 空や肌に帯が出る | 滑らかなグラデーションには1フレーム256色では足りない | フレーム内で最も広いグラデーションを見る | ディザリングを50 %か100 %にし、256色のままにする |
|---|
| GIFが大きすぎる | 幅とフレーム数が掛け算になる。640 px・24fpsは480 px・15fpsの2.8倍の画素 | 実行前に予想容量を比べる | 幅かfpsを下げる、区間を短くする、切り抜く、または目標容量を入れる |
|---|
| 目標容量には収まったが、設定より画質が悪い | 収めるため、まず色数を64(次に32)に、次に幅とfpsを一緒に下げる | 結果の欄に最終的な幅とフレーム数が出る | 目標を上げるか、代わりに区間を短くする |
|---|
| 長いクリップが遅い、または逆再生がメモリのメッセージで止まる | 全フレームをデコード・減色・圧縮し、逆再生は最後まで全フレームを保持する(番号データ64 MBまで) | 進行表示に全体の何フレーム目かが出る | 区間や幅・fpsを減らし、長いクリップでは逆再生をオフにする |
|---|
| スマホの動画でデコーダーのエラーが出る | ブラウザが映像コーデック(主にHEVC)をデコードできない | コーデックの調べ方はMOVのガイドを参照 | デコードできるブラウザを使うか、H.264で撮影する |
|---|
ほかの方法
| 方法 | こんなときに向いています |
|---|
palettegenとpaletteuseフィルターを使うFFmpeg | クリップ全体に最適化したパレット1つと5種類のディザリング(既定はSierra-2-4A)をスクリプトで。コマンドラインのみです。 |
|---|
| GIFの代わりに短いMP4・WebM | 投稿先が動画を受け付けるなら、同じ画質でずっと小さく、音声も付きます。動画の圧縮を参照。 |
|---|
| スプライトシートをGIFに | 撮影した動画ではなくドット絵のアニメーションのフレームのとき。 |
|---|
この方法の限界
- 透過GIFは作りません。すべてのフレームが不透明です。
- 文字やスタンプの重ね合わせはなく、パレットはクリップ全体ではなくフレームごとに作ります。
バージョンと出典
tests/media-browser.mjsで、Chromium 153とFirefox 155を使って確認しました。2秒を640 px・12fpsにすると幅640 pxの24フレームになり、0.25 MBの目標は測定しながらのエンコードで達成し、逆再生・2倍速・1:1切り抜きのGIFは予定どおり5フレームで正方形になり、3フレームからの予想は実際の容量と25 %以内でした。フレームはMediabunny 1.58.1とWebCodecsでデコードし、gifenc 1.0.3でエンコードします。GIFの制約はGIF89aの仕様に基づきます。
参照した公式ドキュメント
動画 → GIF
幅・FPS・色数を設定し、フレームを順番に処理。
使い方
- 動画を開き短い区間を選択
- 幅・フレームレート・色数を設定
- GIFを保存し動き・色・容量を確認
対応形式
MP4 / WebM / MOV → GIF — 読み込み・書き出しはブラウザの対応状況によります。
このツールでできること
1フレームずつ読み、GIFの幅・FPS・色数・ディザを選択します。
処理方式と検証状況
advanced · WebCodecs sequential frames / gifenc adaptive palettes / measured size targets. 品質検証中です。Pro・Flagship水準はまだ実証されていません。
書き出す前に
高速カットは範囲内のキーフレームに短縮します。精密モードは再エンコードし、コーデック対応は環境次第です。可能なら端末の一時保存を使います。互換録画の短時間制限は残ります。
よくある質問
対応サイズは何で決まりますか?
端末のメモリ・保存容量・コーデック対応によります。テスト例はすべてのファイルの動作保証ではありません。
ファイルはアップロードされますか?
このツールで開いたファイルはアップロードせず端末で処理します。コミュニティの投稿に明示的に添付する画像は別途アップロードされます。一部のエンジンやモデルは外部から取得するため、IPアドレスなどの接続情報は配信元に伝わります。
作業は自動保存されますか?
いいえ。画像と編集状態はこのタブに保持され、メディア出力は端末の一時保存を利用する場合があります。言語を変えても作業は残りますが、再読み込み、タブを閉じる操作、別のページへの移動で失われることがあります。