ZeroTool Workbench
GIF 圧縮ツール
アップロードなしで GIF を圧縮。ロッシー LZW、減色、リサイズ、フレーム間引きに対応し、圧縮前後のサイズをブラウザ上で比較できます。
使い方
- GIF をドロップエリアに置くか、クリックして選択します。コピーした GIF ファイルを Ctrl/Cmd+V で貼り付けることもできます。
- 読み込むと選択中の設定で 1 回自動的に圧縮し、元の GIF と結果を並べてファイルサイズとともに表示します。
- 設定を変えたら「圧縮」を押して作り直します。エンコードは重い処理なので、スライダーを動かすたびに再計算はしません。
- 「GIF をダウンロード」で
{元の名前}-compressed.gifとして保存します。
各設定とファイルサイズの関係
| 設定 | 内容 | サイズへの影響 |
|---|---|---|
| ロッシー(0–100、既定 40) | 色ずれが「ロッシー × 0.6」以内なら LZW が既存の並びを再利用できる | 動画から作った GIF では最も効きやすい項目。231 フレームの画面録画では 40 で元の 42%、100 で 19% |
| 色数(256〜4) | カラーテーブルの大きさ。1 枠は透明用 | 色が少ないほど符号が短くなり、繰り返しも増える。元の GIF の色数が上限以内なら、パレットは元の色のまま |
| 幅 | 縦横比を保って縮小。高さは自動 | 画素数は縮小率の 2 乗で減る。幅を半分にするとデータ量はおよそ 4 分の 1 |
| フレーム | 2・3・4 フレームごとに 1 枚を残す | 保存するフレームが減る。残したフレームは間引いたフレームの時間も表示するため、全体の長さは変わらない |
| ディザリング | Floyd–Steinberg 誤差拡散 | 色数が少ないときにグラデーションがなめらかになる代わりに、ファイルは大きくなりやすい |
幅は縮小のみです。空欄、0、元の幅より大きい値はすべて元の幅として扱います。縮小では、出力画素が覆う元の画素を面積で重み付けして平均します。不透明な部分が半分に満たない出力画素は透明になります。
フレームの表示時間は 10 ms 単位で書き込み、最小は 20 ms です。元のファイルで 0 または 10 ms のフレームは 100 ms として書き込みます。ブラウザが実際にそう再生するためです。
フレーム最適化のしくみ
GIF の各フレームはキャンバス全体を覆う必要がありません。このツールは最初のフレームだけを全体で書き込み、以降のフレームは画面に表示中の内容と比べて、変化した画素を含む最小の矩形だけを書き込みます。矩形の中で変化していない画素は透明色にして前のフレームを透かせ、長い連続としてまとめて圧縮します。まったく変化のないフレームは透明な 1 画素だけにして、表示時間を残します。
透明の画素にはもう一手間かかります。見えていた画素を透明に戻したいとき、その上に透明の画素を描いても何も起きません。そこで直前のフレームの処理方法(disposal)を 2(背景に戻す)にし、その矩形を該当する画素まで広げます。ブラウザは次のフレームを描く前にその範囲を消去します。
パレットはアニメーション全体で 1 回だけ作ります。全フレームで使う色がカラーテーブルに収まるなら、色はそのまま残ります。収まらない場合はメディアンカットで色空間を箱に分け、箱ごとの平均色を使います。
対応範囲
- 出力は常に GIF です。WebP 変換器は GIF の最初のフレームを静止 WebP に変換します。アニメーション WebP が必要な場合は、PC で libwebp 付属の
gif2webpを使ってください。
gif2webp -lossy -q 75 in.gif -o out.webp
- MP4 は同じ内容の GIF より数倍小さくなることが多い形式です。PC の ffmpeg で変換してください。幅か高さが奇数の場合は、yuv420p が偶数サイズを必要とするため
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"を加えます。
ffmpeg -i in.gif -movflags +faststart -pix_fmt yuv420p out.mp4
- フレームの切り抜き・並べ替え・編集はできません。GIF を PNG のフレームに分けるには GIF 分解ツールを使ってください。
- サイズ上限:デコード後 5,000 万ピクセル、1,000 フレーム、1 フレーム 16,777,216 ピクセル。
- JPEG・PNG・WebP 画像は画像圧縮ツールをご利用ください。
関連ツール
FAQ
GIF はどこかにアップロードされますか?
いいえ。ファイルは File API で読み込み、このページの JavaScript がブラウザ内でデコードと再エンコードを行い、結果はメモリから直接ダウンロードします。ローカルに保存するのは設定(ロッシー、色数、フレーム、ディザリング)だけです。幅はファイルごとに決まるため保存しません。元の GIF と圧縮結果はどこにも保存されません。
「ロッシー」スライダーは何をしていますか?
GIF は LZW で画素を圧縮します。画素の並びが以前に出てきた並びを繰り返すほど、ファイルは小さくなります。ロッシーが 0 より大きいと、既知の並びを延ばせる場合に限り、エンコーダーは画素を近い色のパレット色に置き換えて書き込みます。許容する最大の色ずれは「ロッシー × 0.6」(RGB 空間での距離)で、既定値 40 なら 24、100 なら 60 です。フレーム間では、表示中の画素との距離がこの範囲内なら変化なしとみなし、描き直しません。透明の画素は変わりません。0 のときは画素をそのまま書き込みます。
圧縮後のほうが大きくなることがあるのはなぜですか?
gifsicle -O3 で最適化済みの GIF や、フレームごとに別のカラーテーブルを持つ GIF があるためです。このツールは全フレーム共通のパレットを 1 つだけ書き出し、色数は最大 255 色と透明 1 枠です。元の GIF が 256 色を使い切っていたり、フレームごとに色が違ったりすると再減色が必要になり、サイズが増えることがあります。その場合はページに表示され、ファイルはそのままダウンロードできます。小さくしたいときは、色数を減らす、ロッシーを上げる、幅を縮めるのいずれかを試してください。
どのくらいの大きさの GIF まで扱えますか?
デコード後 5,000 万ピクセル(幅 × 高さ × フレーム数)、1,000 フレーム、1 フレーム 16,777,216 ピクセル(一辺 16,384 px)までです。GIF 分解ツールと同じ上限で、スマートフォンのメモリに収まるようにしています。それより大きいファイルは、PC で gifsicle -O3 --lossy=80 --colors 128 input.gif -o output.gif を実行してください。
ディザリングが既定でオフなのはなぜですか?
ディザリングは隣り合うパレット色の画素を散らして、パレットにない色を再現します。この点のパターンはフレームごとに変わり、動いていない部分でも変わるため、変化なしとみなせる画素が大きく減り、LZW も繰り返しを見つけにくくなります。231 フレームの画面録画で試したところ、64 色でディザリングをオンにすると出力が 1.9 倍(元の 42% から 80%)になりました。色数が少なくグラデーションの縞が目立つときだけオンにするのがおすすめです。