Resize an animated GIF
Resize an animated GIF to any width — 128 px emoji, 480 px for docs — rebuilding the palette on every frame so small sizes stay sharp.
- Runs in your browser
- Files are never uploaded
- Free, no account
First use downloads the 10 MB video engine from this site. After that it is cached and works offline. It is WebAssembly served by onthisdevice.com — never a third-party CDN — and your file is still processed entirely on your own device.
How to resize an animated GIF
- Drop the GIF in. Its dimensions, frame count, frame rate and loop setting are read from the file header immediately, before anything is decoded.
- Pick a preset or type a width. The height follows automatically; override it only if you deliberately want to distort the image.
- Leave the palette at 256 colours unless you are also chasing a file-size limit.
- Press resize, compare the result with the original above it, and download.
Target sizes worth knowing
| Width | Used for | Also constrained by |
|---|---|---|
| 128 px | Discord custom emoji and stickers | 256 KB file size |
| 128 px | Slack custom emoji | 128 KB file size |
| 256 px | Forum avatars, small reaction images | Often 512 KB |
| 320 px | Inline chat images, mobile-first content | — |
| 480 px | README files, documentation, changelogs | GitHub renders at container width |
| 640 px | Full-width blog posts on a phone screen | Page-weight budgets |
Why naive GIF resizing looks so bad
This is the part most resizers get wrong, and it is worth understanding because it explains why the same GIF can come out clean here and blotchy elsewhere.
A GIF is already quantised: each frame is an index into a table of at most 256 colours. When you scale it, the resampling filter averages neighbouring pixels, and those averages are new colours that were never in the table. A naive resizer then snaps each new pixel back to the nearest entry in the original palette. If the source palette was built around large flat areas, the intermediate tones created by scaling have nowhere sensible to land, and you get the blotching and colour drift familiar from cheap GIF resizers.
This tool runs FFmpeg’s two-pass palette pipeline after scaling instead. The scaled frames are analysed to build a new 256-colour palette from the colours the resized animation actually contains, and only then are the frames mapped onto it with dithering. The extra pass costs a second or two and is the difference between a 128 px emoji that reads clearly and one that looks like a fax.
Lanczos, and why it is the right filter here
Scaling uses the Lanczos filter, a windowed sinc kernel that samples a wider neighbourhood than bilinear or bicubic interpolation. It preserves edges and fine text noticeably better when shrinking by large factors — which is exactly what happens going from a 500 px screen recording to a 128 px emoji. The trade-off is slight ringing around very high-contrast edges, invisible at these sizes and a fair price for the sharpness.
What is preserved and what changes
- Preserved: frame count, every per-frame delay, the Netscape loop block (so an infinite GIF stays infinite), and overall playback speed.
- Changed: pixel dimensions, the colour palette, and therefore the file size.
- Not preserved: any comment or application extension blocks beyond the loop count. That is a feature — those are where authoring tools stash identifying metadata.
Can I enlarge a GIF?
You can type a larger width and Lanczos will do a respectable job of it, but be clear about what is happening. The source has already discarded colour information down to 256 entries, and no filter recovers detail that was never stored. Enlarging also multiplies file size by the area ratio: doubling the width roughly quadruples the bytes. If the animation came from a video, re-export it from the original at the size you need with the video to GIF tool instead.
Resize first, then compress
Resolution is the strongest single influence on GIF size, so resizing is usually the first move and often the only one needed. If the resized file is still over a hard byte limit — a 128 KB Slack emoji, say — send it through Compress GIF, which will search frame rate and palette settings for the best version that fits. Going the other way round wastes the compressor’s effort on pixels you were about to throw away.
No upload, no cap
The GIF is decoded and re-encoded by FFmpeg running as WebAssembly inside this tab. Nothing is sent anywhere, there is no per-day limit and no maximum file size beyond your device’s memory, and the output has no watermark. Once the engine has been cached, the page works with the network switched off entirely.
Questions
What size do Discord and Slack emoji need?
Discord custom emoji are displayed at 32 px but uploaded at up to 128 × 128 and must be under 256 KB. Slack allows 128 × 128 and 128 KB. Both presets are in the dropdown; pair this tool with Compress GIF if the resized file is still over the byte limit.
Why does resizing change the colours?
Scaling blends neighbouring pixels, which creates colours that were not in the original 256-entry palette. Rather than snapping them to the old table — which is what a naive resizer does, and why small GIFs go blotchy — this tool builds a fresh palette from the scaled frames and re-dithers against it.
Does resizing keep the animation and the loop setting?
Yes. Frame count, per-frame delays and the Netscape loop block are all preserved, so the animation plays at the same speed and loops the same number of times. Only the pixel dimensions and the palette change.
Can I make a GIF larger?
You can enter a bigger width, and Lanczos scaling will do a decent job, but a GIF is already quantised to at most 256 colours — enlarging cannot recover detail that the palette threw away. Upscaling also multiplies the file size by the area ratio.