Quasistatic GIF Creator
Create animated GIF files from uploaded images with full control over frame delay, loop count, and color quantization. Real GIF89a encoding in-browser.
Drop images here or click to browse
PNG, JPG, WebP, BMP — any order, any size
About
A quasistatic GIF is a near-still animation where frames differ by subtle shifts - a flickering light, a slow gradient pulse, a gentle parallax offset. The format exploits the GIF89a specification's Graphics Control Extension to loop 2 - 255 near-identical frames at configurable inter-frame delays (d in centiseconds, range 2 - 6553500 ms). This tool performs real LZW compression and Median Cut color quantization directly in your browser. No server upload occurs. Each frame is reduced to a palette of at most 256 colors per the GIF specification. Misconfiguring quantization quality produces visible banding; setting inter-frame delay below 20 ms causes most browsers to clamp it to 100 ms, breaking intended timing.
The encoder constructs the binary GIF89a byte stream from scratch: Header, Logical Screen Descriptor, Global Color Table, Application Extension (NETSCAPE2.0 for looping), per-frame Graphics Control Extensions, Image Descriptors with LZW-compressed pixel data, and Trailer. Output file size scales with frame count and color entropy. Frames with large flat regions compress efficiently; photographic content with noise does not. Expect 50 - 500 KB per frame at 480p.
Formulas
The GIF89a frame delay d is stored as a 16-bit unsigned integer in centiseconds. Actual display time per frame:
Total animation duration for n frames:
LZW compression ratio depends on pixel entropy. The minimum code size m is derived from palette size k:
Where d = delay in centiseconds, n = frame count, T = total loop duration, k = number of colors in palette, m = LZW minimum code size in bits. The code table resets when it reaches 212 = 4096 entries.
Reference Data
| Parameter | GIF89a Spec Value | Practical Range | Notes |
|---|---|---|---|
| Max Colors | 256 | 2 - 256 | Per-frame local palette |
| Frame Delay | 0 - 65535 cs | 2 - 100 cs | Browsers clamp <2 cs to 10 cs |
| Loop Count | 0 - 65535 | 0 = infinite | NETSCAPE2.0 extension |
| Max Width | 65535 px | ≤2048 px | Memory-limited in browser |
| Max Height | 65535 px | ≤2048 px | Memory-limited in browser |
| LZW Min Code Size | 2 - 8 bits | Matches palette bit depth | Derived from color count |
| LZW Max Code Size | 12 bits | Fixed | Table resets at 4096 entries |
| Disposal Method | 0 - 7 | 0 - 3 | 2 = restore to background |
| Interlacing | Supported | Off (faster encoding) | Adds complexity, rarely needed |
| Transparency | 1 index | Optional | One palette entry marked transparent |
| Color Quantization | N/A | Median Cut / NeuQuant | Quality 1 - 30 (lower = better) |
| Typical File Size (480p) | N/A | 50 - 500 KB/frame | Depends on entropy |
| Browser Delay Floor | N/A | 20 ms | Chrome/Firefox impose minimum |
| NETSCAPE2.0 Block | 19 bytes | Fixed structure | Required for animation looping |
| Header Signature | GIF89a | 6 bytes | ASCII: 47 49 46 38 39 61 |