Animated GIF
3つのツール、1つのアセンブリコア。入力に応じて適切なルートを選択してください。
| 入力 | ツール | モーション |
|---|---|---|
| ANSIカラーのテキストフレーム | bin/ascii_gif.py | フレームシーケンス |
| 写真または画像のフォルダ | bin/pics_gif.py | ホールド、クロスフェード、ケンバーンズ |
| SVGまたはHTMLアニメーション | bin/svg_gif.py | SMIL、CSS、またはプリセット回転/パルス/フェード |
全ルートで共通の bin/gifkit.py を使用:ループ全体で1つのパレット、10msのタイミンググリッド、同一連続フレームをより長い遅延に統合、アトミック書き込み、読み取り検証。
依存関係
Pillowが必要です。SVGおよびHTMLにはNode、Playwright、Chromiumヘッドレスシェルが必要です。
python -c "import PIL; print(PIL.__version__)"
node -e "require('playwright')"
npx playwright install chromium --only-shell
各ツールは、依存関係または入力がない場合、stderrに1行の FAIL ... を出力して終了コード1で終了します。同じ引数で再試行しないでください。
ワークフロー
- 表からルートを選択します。以下の該当セクションを読んでください。
- 作業中のプロジェクト内に明示的な出力パスを指定してツールを実行します。システムの一時ディレクトリやデスクトップには書き込まないでください。
- 出力されたサマリー(フレーム数、長さ、ピクセルサイズ)を保持してください。表示されたパスは検証済みのGIFです。
- 視覚的な作業の場合は、GIFを開くか、
--preview preview.pngを書き込んで、その静止画を確認してからレポートしてください。 - 絶対パスと、fps、サイズ、長さ、モードなどの重要な設定を報告してください。
ASCIIルート
入力はテキストファイルです。フレームは --- のみの行で区切られます。区切り文字の後にオプションの遅延(ミリ秒)を続けることができます:--- 250。ANSI SGRカラー(30-37、90-97、38;5;n、38;2;r;g;b)が反映されます。.txt ファイルのディレクトリは、名前順にソートされて1フレームあたり1ファイルとして読み取られます。
python bin/ascii_gif.py frames.txt -o project/loader.gif --size 28 --delay 120
python bin/ascii_gif.py frames/ -o project/loader.gif --preview project/loader.png
--fontは等幅TTFまたはTTCでなければなりません。省略時は一般的な等幅フォントが自動検出されます。--widthと--heightはキャンバスを固定し、テキストグリッドを中央に配置します。両方を指定するか、両方とも指定しないでください。複数のサンプル間でサイズを一致させるために使用します。--fgと--bgのデフォルトは、ほぼ黒のキャンバスに明るいテキストです。--delayはデフォルトのフレーム遅延です。区切り文字の遅延がフレームごとにこれを上書きします。- フレームは約120列、40行以内に収めてください。大きなキャンバスは長いGIFになります。
画像フォルダルート
ファイルは自然順にソートされ(pic-2 が pic-10 より前)、EXIF回転が適用され、1つのキャンバスにフィットします。
python bin/pics_gif.py photos/ -o project/reel.gif --mode kenburns --fps 12 --hold 1.2 --transition 0.5 --width 800
python bin/pics_gif.py photos/ -o project/reel.gif --mode sequence --fps 10 --hold 0.8 --fit contain --bg "#101010"
sequenceは各画像をそのまま保持します。crossfadeは画像間をブレンドします。kenburnsは各画像をゆっくりズームし、方向を交互に変えます。--widthはキャンバスを設定します。--heightはデフォルトで最初の画像のアスペクト比になります。--fit coverはトリミングしてフィットさせ、containは--bgでパディングします。--holdは画像あたりの秒数、--transitionはブレンドの秒数、--zoomはケンバーンズの終了ズームです。- 100枚の写真を800px、12fpsで処理すると大きなファイルになります。最初に幅かfpsを落としてください。
SVGおよびHTMLルート
このツールは、.svg を指定されたビューポートでページにラップするか、.html をそのまま開き、各スクリーンショットの前にアニメーションを明示的な時間に停止してシークします。フレームはウォールクロックタイミングに依存しません。
python bin/svg_gif.py logo.svg -o project/logo.gif --duration 3 --fps 15
python bin/svg_gif.py logo.svg -o project/logo.gif --animate rotate --selector "#mark" --duration 2 --background "#0b0d12"
python bin/svg_gif.py page.html -o project/page.gif --width 960 --height 540 --duration 4 --fps 12
--animateなしの場合、SVGまたはページはSMILまたはCSSで既にアニメーションしている必要があります。静的な図にはプリセットが必要です。- プリセット:
rotate、pulse、fade。svgルートまたは--selectorに適用されます。 --widthと--heightのデフォルトはSVGのwidth/heightまたはviewBoxです。--dpr 2はビューポートの2倍でキャプチャし、テキストをよりシャープにします。その場合、GIFのピクセルサイズは2倍になります。- JS駆動のキャンバスやWebGLページはこのツールでは制御できません。フレームフックを公開するページを使用するか、フレームを事前レンダリングしてgifkitでアセンブルしてください。
共通オプション
--colors最大255。パレットが単純な場合やファイルサイズを縮小する必要がある場合にのみ低く設定します。--dither noneはフラットアートやテキストに適しています。floydはグラデーションや写真に効果的です。--loop 0は無限ループ。その他の値は指定された回数だけ繰り返します。--preview PATHは最初のフレームのPNG静止画を書き込みます。- 出力は、同じ入力、設定、ツールチェーンに対して決定論的です。
カスタムフレーム
任意のフレームシーケンスで同じコアを使用できます。フレームはRGBで同じサイズである必要があり、遅延は10msグリッド上のミリ秒で指定します。
import sys
sys.path.insert(0, "bin")
import gifkit
from PIL import Image
frames = [Image.new("RGB", (320, 180), (n * 20, 40, 90)) for n in range(12)]
gifkit.write_gif(frames, "project/gradient.gif", [100] * 12)
write_gif は1つのパレットを構築し、同一の連続フレームを統合し、アトミックに書き込んで結果を検証します。このルートは、データアニメーション、生成された図、またはこれらのルートでカバーされない任意のフレームに使用します。
契約
- ツールは出力ディレクトリに
<name>.tmp.gifを書き込み、ファイルを読み戻してフレーム数、合計長さ、ピクセルサイズを検証し、その後リネームします。失敗した場合は一時ファイルを削除し、不完全なターゲットを残しません。 - GIFはすべてのフレームで1つのパレットを使用するため、色がちらつくことはありません。
- 同一の連続フレームは、より長い遅延を持つ1つのフレームに統合されます。印刷されるフレーム数は保存されたフレーム数です。
- 遅延は10msのGIFグリッド上に配置され、最低20msです。
検証
ルートのチェックはソースリポジトリにあります。リポジトリルートから実行します:
python tools/check.py
各チェックは PASS、SKIP、または FAIL の1行を出力します。オプションの依存関係が欠けている場合はデフォルトでスキップされます。--strict はすべてのルートを必須にします。チェックは scratch/checks の下にフィクスチャを生成し、リポジトリ内のシークレット、絶対パス、非ASCIIテキスト、CRLF改行もスキャンします。
制限
- GIFは8ビットインデックスで、256色に制限されます。写真はディザリングなしではバンディングが発生します。
- ビューアは短い遅延をクランプします。フレーム遅延は20ms以上に保ってください。
- 長く、高fpsで、トゥルーカラーのシーケンスはAPNGやWebMの方が適しています。品質を求められたらそのように伝えてください。
- メモリはフレーム数とキャンバスサイズに応じて増加します。ツールは1つのパレットを構築する間、すべてのフレームを保持します。
- ASCIIグリフのカバレッジは選択したフォントに依存します。ボックスやブロックグリフがない場合は空のボックスにフォールバックします。
フォーマットの制約とこれらのデフォルトの背後にある理由については、references/animated-gif-considerations.md を参照してください。
ファイル
bin/gifkit.py- パレット、タイミング、統合、アトミック書き込み、検証。bin/ascii_gif.py- ANSIテキストフレームからGIFへ。bin/pics_gif.py- 画像フォルダからGIFへ。bin/svg_gif.py- SVG/HTMLアニメーションからGIFへ。bin/render_frames.cjs- Playwrightフレームキャプチャヘルパー。references/animated-gif-considerations.md- フォーマットに関する注記。
リポジトリのチェックとサンプル生成は tools/ にあり、インストールされたスキルペイロードの外部にあります。