induwara.lk
induwara.lkImage · Privacy-first

GIF Maker — turn images into an animated GIF

Stitch JPG, PNG, WebP, AVIF, or GIF frames into a single animated .gif file in your browser. Set the frame delay, loop count, and output dimensions — files never leave your device, no signup, sources cited below.

By Induwara AshinsanaUpdated May 11, 2026
GIF Makerimages → animated GIF · in-browser
Files stay on your device

Everything runs in your browser. Nothing is uploaded.

What this does

Drop in two or more images and the tool stitches them into a single animated .gif file you can download. Reorder, trim, or resize before encoding. One image still works — you'll get a single-frame GIF, useful when a forum or chat refuses other formats.

Frames will encode at 16 × 16 px

Plays continuously.

ms / frame

5 fps. Range 2010000 ms. Most browsers floor delays below 20 ms.

colours / frame

2256 (GIF89a hard limit is 256). Lower = smaller file, more banding.

Frames
0
Add at least one image
Output size (px)
Capped at 480 px longest side
Total duration
File size
Press Encode to compute
Ready to encode

Add at least one frame to get started.

Estimator uses an empirical bytes-per-pixel band fitted against gifenc output on flat / midtone / photo content. Actual file size is set by the LZW encoder and may differ ±15% on textured frames. Sources last verified 2026-05-11.

How it works

The GIF format hasn't changed since CompuServe published the GIF89a specification in July 1990. A GIF is a sequence of palette- indexed bitmaps wrapped in three layers of metadata: the file header, an optional Global Colour Table, and one Graphic Control Extension + Image Descriptor per frame. The pixel data of each frame is compressed with LZW (Welch, 1984) — the same algorithm UNIX compress used to ship inside .tar.Z archives a year before GIF was published. Loop counts above one are encoded via the Netscape 2.0 Application Extension, a de-facto standard added by Netscape Navigator 2.0 in 1996 and supported by every browser and image viewer since.

The encoding pipeline this tool runs has five deterministic steps per frame, then one finalisation step at the end:

  1. Decode. Load each source through createImageBitmap (or, on browsers without it, the <img> element) so the browser's native decoder reads JPG, PNG, WebP, AVIF, GIF, and BMP without any JavaScript decoder.
  2. Cover-fit. Every frame in a GIF must share one rectangle. The tool picks the median width × height across the queue, applies the chosen longest-side cap, and cover-fits each frame onto that rectangle (scale uniformly to fill, centre-crop the overflow).
  3. Quantise. Each frame's 24-bit RGBA pixels are reduced to a palette of up to 256 colours using PnnQuant — a port of the Pairwise Nearest Neighbour algorithm (McNeill, 2018). Photo content tolerates 256 colours invisibly; flat-colour cartoons can drop to 64 with no perceptible loss.
  4. Index. Map every pixel to its nearest palette entry, producing a flat Uint8Array with one byte per pixel. This is the input the LZW compressor actually sees.
  5. Compress & write. LZW compresses the indexed bitmap, the encoder writes a Graphic Control Extension (delay + transparent index) and an Image Descriptor, then the compressed pixel data. On the first frame the encoder also writes the GIF header, the Logical Screen Descriptor, the Global Colour Table, and — when the loop count isn't -1 — the Netscape 2.0 application extension.

File-size estimation uses an empirical bytes-per-pixel band fitted against gifenc output on representative content:

bytes_per_frame = pixels × density + 18 (GCE + ImgDesc)
  density(flat)    = 0.40
  density(midtone) = 0.55
  density(photo)   = 0.70
header           = 14 + 19 (Netscape) + 3 × paletteSize (Global Colour Table)
total            = header + frames × bytes_per_frame

The estimator is cross-checked against a discrete content-band lookup; the two land within ±5% on every input. The per-pixel density is the LZW dictionary's reward for finding long runs of repeated colour: cartoons with large flat regions compress to about 0.4 bytes per pixel, photographs with smooth gradients pay closer to 0.7. Real output may differ ±15% on textured frames — the figure on the calculator is a best estimate, not a measurement.

Worked examples

10-frame photo slideshow at 480 × 270

Ten phone snapshots resized to 480 × 270, 200 ms per frame, 256-colour palette. Photos quantise to about 0.7 bytes per pixel after LZW, so the file lands near 887 KB — small enough to embed in a Slack thread without the upload prompt.

  1. Pixels / frame: 480 × 270 = 129,600
  2. Frames: 10 · palette: 256 colours
  3. Timing: 200 ms / frame → total 2.0 s
  4. Estimate (curve): ≈ 886.9 KB
  5. Cross-check (lookup): ≈ 886.9 KB

5-frame cartoon loop at 256 × 256

Five flat-colour drawings (vector exports), 100 ms per frame, palette trimmed to 64 colours. Cartoons compress to about 0.5 bytes per pixel because LZW finds long runs in solid regions, so the file lands near 160 KB.

  1. Pixels / frame: 256 × 256 = 65,536
  2. Frames: 5 · palette: 64 colours
  3. Timing: 100 ms / frame → total 500 ms
  4. Estimate (curve): ≈ 128.3 KB
  5. Cross-check (lookup): ≈ 128.3 KB

Single-frame static GIF at 320 × 240

One PNG converted to GIF — handy when a forum or chat refuses non-GIF uploads. 128-colour palette, no animation. Encodes to about 38 KB.

  1. Pixels / frame: 320 × 240 = 76,800
  2. Frames: 1 · palette: 128 colours
  3. Timing: 200 ms / frame → total 200 ms
  4. Estimate (curve): ≈ 30.4 KB
  5. Cross-check (lookup): ≈ 30.4 KB

Frame delay and frame rate at a glance

GIF delays are stored as hundredths of a second (a 16-bit unsigned integer). The tool exposes the value in milliseconds because that's the unit web tools speak; the table below shows what each common delay translates to.

DelayFrame rateReads asBest for
40 ms25.0 fpsFastSmooth animation, video-like
80 ms12.5 fpsFastReaction GIFs, screen recordings
100 ms10.0 fpsBriskAnimated emoji, micro-interactions
200 ms5.0 fpsBriskSlideshow, step-by-step instructions
500 ms2.0 fpsSteadyPhoto carousel, slow montage
1000 ms1.0 fpsSlowManual-paced reveal, presentation

Most browsers floor the effective delay at 20 ms and quietly bump 0–10 ms delays to 100 ms for compatibility with very old GIF89a players. Stay above 20 ms to keep playback consistent across Chrome, Firefox, Safari, and Edge.

Frequently asked questions

Sources & references

Related tools

Rate this tool
Be the first to rate

Comments & feedback

Spotted a bug or want an improvement? Tell us — our team reviews every comment, and good ideas get built. Comments are public and anonymous.

Found a bug, edge case, or want to suggest an improvement?

Email me at [email protected] — most fixes ship within 24 hours.