Communitygithub.com

animated-gif

ASCIIテキストフレーム、画像フォルダ、SVG/HTMLアニメーションからアニメーションGIFを生成します。パレット、タイミング、ループ、スケーリング、検証を自動処理。GIFの作成、変換、リサイズ、スロー化、修正、ASCIIアートのアニメーション化、写真のスライドショーGIF化、SVGのアニメーション化に使用します。

animated-gif とは?

このスキルは、3種類のツールと共通のコア処理(gifkit.py)を組み合わせることで、多彩な入力ソースから高品質なアニメーションGIFを生成します。テキストフレーム(ANSIカラー対応)、画像フォルダ(クロスフェードやケンバーンズ効果対応)、SVG/HTMLアニメーション(SMIL、CSS、プリセットアニメーション対応)の3つのルートを提供。共通コアは1つのパレットをループ全体で使用し、10msグリッドのタイミング制御、同一連続フレームの統合、アトミック書き込みと読み取り検証を自動実行。出力は決定論的で、--previewオプションによる静止画プレビューも可能。フレームシーケンスを任意に生成してgifkit.write_gif()を直接呼び出すカスタムフレームルートもサポート。Pillow必須、SVG/HTMLルートではNode.jsとPlaywright(Chromiumヘッドレス)が必要。各ツールは依存関係や入力不足時にFAILメッセージを出力して終了コード1を返す。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/chezhenkie/animated-gif-skill/tree/HEAD/agent-skill

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Animated GIF

3つのツール、1つのアセンブリコア。入力に応じて適切なルートを選択してください。

入力ツールモーション
ANSIカラーのテキストフレームbin/ascii_gif.pyフレームシーケンス
写真または画像のフォルダbin/pics_gif.pyホールド、クロスフェード、ケンバーンズ
SVGまたはHTMLアニメーションbin/svg_gif.pySMIL、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で終了します。同じ引数で再試行しないでください。

ワークフロー

  1. 表からルートを選択します。以下の該当セクションを読んでください。
  2. 作業中のプロジェクト内に明示的な出力パスを指定してツールを実行します。システムの一時ディレクトリやデスクトップには書き込まないでください。
  3. 出力されたサマリー(フレーム数、長さ、ピクセルサイズ)を保持してください。表示されたパスは検証済みのGIFです。
  4. 視覚的な作業の場合は、GIFを開くか、--preview preview.png を書き込んで、その静止画を確認してからレポートしてください。
  5. 絶対パスと、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/ にあり、インストールされたスキルペイロードの外部にあります。

関連スキル