Sprite Animator
Turn any image into an animated pixel art sprite GIF. Uses Gemini image generation to create 16-frame sprite sheets, then assembles them into looping GIFs.
Requirements
GEMINI_API_KEY or GOOGLE_API_KEY env var must be set
- Install:
uv tool install sprite-animator (or uvx sprite-animator for one-off runs)
Quick Usage
# Best quality for photos — two-step converts to pixel art first, then animates
sprite-animator -i photo.png -o dance.gif -a dance --two-step -s 256 -r 2K
# From drawings or pixel art (single step is fine)
sprite-animator -i drawing.png -o idle.gif -a idle -s 256 -r 2K
Animation Types
idle — gentle breathing + blink (default)
wave — arm raise → wave → return
bounce — crouch → jump → land
dance — lean, spin, jump — full party mode
Key Options
| Flag |
Description |
Default |
-i |
Input image path |
required |
-o |
Output GIF path |
required |
-a |
Animation type (idle/wave/bounce/dance) |
idle |
-s |
Output sprite size in px |
128 |
-r |
Generation resolution (1K/2K) |
1K |
-d |
Frame duration in ms |
100 |
--two-step |
Pixelate first, then animate (better for photos) |
off |
--keep-sheet |
Save raw sprite sheet |
off |
--keep-frames |
Save individual frame PNGs |
off |
Tips
- Use
--two-step for photos of real people — Gemini loses likeness otherwise
- Use
-r 2K for noticeably better quality
- Use
-d 180 for more natural playback speed (default 100ms is fast)
- Save good base pixel art sprites and reuse them for different animations
- On Telegram, send GIFs as documents to avoid MP4 conversion
Python API
from pathlib import Path
from PIL import Image
from sprite_animator.cli import ANIMATION_PRESETS, generate_sprite_sheet, create_gif, call_gemini, get_api_key
from sprite_animator.template import create_template, extract_frames
api_key = get_api_key()
preset = ANIMATION_PRESETS["dance"]
# Create template and generate sprite sheet
template = create_template(cols=4, rows=4, labels=preset["labels"])
template.save("template.png")
generate_sprite_sheet(
api_key=api_key,
input_image=Image.open("input.png"),
template_path=Path("template.png"),
output_path=Path("sheet.png"),
prompt=preset["prompt"],
resolution="2K",
)
# Extract frames and build GIF
frames = extract_frames(Image.open("sheet.png"), cols=4, rows=4)
create_gif(frames, Path("output.gif"), frame_duration=180, size=256)
1---2name: sprite-animator3description: Generate animated pixel art sprite GIFs from any image using AI (Gemini). Use when the user wants to create pixel art animations, sprite sheets, animated character GIFs, or convert photos/drawings into retro game-style animated sprites. Supports idle, wave, bounce, and dance animations.4license: MIT5---67# Sprite Animator89Turn any image into an animated pixel art sprite GIF. Uses Gemini image generation to create 16-frame sprite sheets, then assembles them into looping GIFs.1011## Requirements1213- `GEMINI_API_KEY` or `GOOGLE_API_KEY` env var must be set14- Install: `uv tool install sprite-animator` (or `uvx sprite-animator` for one-off runs)1516## Quick Usage1718```bash19# Best quality for photos — two-step converts to pixel art first, then animates20sprite-animator -i photo.png -o dance.gif -a dance --two-step -s 256 -r 2K2122# From drawings or pixel art (single step is fine)23sprite-animator -i drawing.png -o idle.gif -a idle -s 256 -r 2K24```2526## Animation Types2728- `idle` — gentle breathing + blink (default)29- `wave` — arm raise → wave → return30- `bounce` — crouch → jump → land31- `dance` — lean, spin, jump — full party mode3233## Key Options3435| Flag | Description | Default |36|------|-------------|---------|37| `-i` | Input image path | required |38| `-o` | Output GIF path | required |39| `-a` | Animation type (idle/wave/bounce/dance) | idle |40| `-s` | Output sprite size in px | 128 |41| `-r` | Generation resolution (1K/2K) | 1K |42| `-d` | Frame duration in ms | 100 |43| `--two-step` | Pixelate first, then animate (better for photos) | off |44| `--keep-sheet` | Save raw sprite sheet | off |45| `--keep-frames` | Save individual frame PNGs | off |4647## Tips4849- Use `--two-step` for photos of real people — Gemini loses likeness otherwise50- Use `-r 2K` for noticeably better quality51- Use `-d 180` for more natural playback speed (default 100ms is fast)52- Save good base pixel art sprites and reuse them for different animations53- On Telegram, send GIFs as documents to avoid MP4 conversion5455## Python API5657```python58from pathlib import Path59from PIL import Image60from sprite_animator.cli import ANIMATION_PRESETS, generate_sprite_sheet, create_gif, call_gemini, get_api_key61from sprite_animator.template import create_template, extract_frames6263api_key = get_api_key()64preset = ANIMATION_PRESETS["dance"]6566# Create template and generate sprite sheet67template = create_template(cols=4, rows=4, labels=preset["labels"])68template.save("template.png")6970generate_sprite_sheet(71 api_key=api_key,72 input_image=Image.open("input.png"),73 template_path=Path("template.png"),74 output_path=Path("sheet.png"),75 prompt=preset["prompt"],76 resolution="2K",77)7879# Extract frames and build GIF80frames = extract_frames(Image.open("sheet.png"), cols=4, rows=4)81create_gif(frames, Path("output.gif"), frame_duration=180, size=256)82```