GIF compressor
Upload or drop any GIF to compress it entirely in your browser. Choose your preferred dimension scaling, palette size (16 to 256 colors), and frame sampling rate. The tool processes each frame in memory using an efficient client-side palette quantizer and re-encodes a compact GIF89a file ready for download.
Drag and drop a GIF file here
Everything happens client-side. The file never leaves your device.
Example
2.5 MB Discord reaction GIF
Scaling from 480px to 360px (75%), reducing palette from 256 to 128 colors, and dropping every 2nd frame shrinks a 2.5 MB animated GIF down to 850 KB (a 66% file size reduction) while maintaining smooth playback.
Related: HEIC converter, Image compressor, PDF to JPG converter, Video compressor
FAQ
- Does this GIF compressor upload my file to a server?
- No. The GIF file is read into memory as a Uint8Array in your browser tab. Frame extraction, color quantization, and GIF re-encoding all execute on your machine. Nothing is uploaded or logged.
- How does client-side GIF compression work?
- GIF file size is governed by dimensions (width × height), number of frames, and palette size. Plaintools reduces file size by downscaling frame dimensions, grouping colors into a smaller palette (e.g. 128 or 64 colors) using median-cut quantization, and optionally skipping redundant frames while preserving playback speed.
- Will dropping frames make my GIF run too fast?
- No. When frames are skipped, the delay duration of the dropped frames is added to the retained frames. The overall animation duration and playback timing remain unchanged.
- What is the maximum GIF file size supported?
- Because decoding occurs entirely in browser memory, GIFs up to 30–50 MB can typically be processed smoothly on desktop devices. For very large GIFs with hundreds of frames, choosing a 50% scale or frame drop significantly speeds up processing.
- How do I compress a GIF without this page?
- Read binary buffer with a GIF decoder (like GifReader). Extract width, height, and frame delays. For each frame, decode RGBA pixels. Scale frame dimensions to target width/height on an HTML5 canvas. If dropping frames, accumulate the delay into the kept frames. Quantize RGB colors across frames into a power-of-two palette (e.g. 128 colors) via median-cut or k-means. Map pixels to palette indices (optionally with Floyd-Steinberg error diffusion). Re-encode using GifWriter with the new palette and delays, and save the binary buffer. No upload required.