fileformer
search⌘KtranslateENexpand_moreupload_fileConvert
Converters8 file families · 44 direct conversions
What changes in a conversionarrow_forward
home/video-tools/video-to-gif

Video to GIF

Pick a moment from any video and turn it into a looping GIF. Trim, resize and tune the frame rate, with a live size estimate before you export.

lockNo uploadblockNo watermarkmemoryReal GIF encoder
moviesample-clip (generated) · 1920×1080 · 0:24.0
0:02.1480×270
pause
Frames are captured, reduced to a palette and LZW-compressed by this page in your browser. The size on the right is the real file.
~/why-gifs-get-big

Three dials control the size.

Each GIF frame is a picture of at most 256 colours, squeezed with LZW, a method built for flat graphics, not camera noise. That's why a few seconds of video can turn into megabytes, and why small changes make a big difference.

timer×2 length → ×2 size
LengthEvery extra second adds another set of frames. Most reaction GIFs are 2-4 seconds.
animation15 → 10 fps ≈ −33%
Frame rate10-15 fps looks smooth for most clips; 24 fps is rarely worth the extra weight.
aspect_ratio640 → 320 px ≈ −75%
WidthSize grows with the area of each frame, so halving the width cuts the file to about a quarter.
Need it smaller or sharper?An MP4 or WebM clip is often 10× smaller than the same GIF, and most chat apps play them on loop.
~/the-256-colour-limit

Why GIFs look grainy.

Video can show millions of colours; a GIF frame can hold at most 256. Smooth gradients, skies, skin, shadows, get squeezed into a few steps. Try it on this gradient.

original video · millions of colours
GIF · 8 colours
Dithering
Visible steps

Steps are obvious in any smooth area. Use this only for cartoons or screen recordings with flat colours.

checkKeep clips with smooth gradients short and small.checkTurn dithering on for photos; off for flat graphics.checkFor true colour, use WebP or MP4 instead.
~/gif-or-something-else

GIF isn't always the best loop.

Typical sizes for a 3-second, 480 px clip saved four ways. The GIF and WebM cards switch to measured values for your clip once it is encoded and recorded below.

Smallest fileBest colourWorks everywhere
.gifbest pick
3.2 MB
Plays everywhereEvery app
Colours256 max
Soundno
The universal choice: works in email, forums and old apps. Typical.
.webpbest pick
900 KB
Plays everywhereMost browsers
Coloursmillions
Soundno
Animated WebP: full colour at a fraction of the size. Typical; browsers can’t encode it here.
.mp4best pick
350 KB
Plays everywhereMost apps
Coloursmillions
Soundoptional
What Twitter and Giphy actually serve when you post a “GIF”. Typical.
.webmbest pick
300 KB
Plays everywhereBrowsers
Coloursmillions
Soundoptional
The smallest option for websites you control. Typical.
~/where-its-going

Will your GIF fit?

Your GIF (≈ 2.6 MB) checked against typical upload limits.

forumSlackcheck_circlemax 50 MB
Large GIFs only animate after a click.
sports_esportsDiscordcheck_circlemax 10 MB
Free accounts; Nitro allows more.
tagX (Twitter)check_circlemax 15 MB
Converted to MP4 on upload.
chatWhatsAppcheck_circlemax 16 MB
Sent as a short looping video.
mailEmailcheck_circlemax 5 MB
Keep it small: many inboxes block big images.
photo_cameraGiphy uploadcheck_circlemax 100 MB
Recommended under 8 MB for best reach.
Typical limits as of 2026; platforms change them without notice.
~/same-frames-four-encoders

What actually makes a GIF smaller.

The first … frames of your clip are encoded four ways by the same LZW encoder, at your colour count. Sizes are real bytes; quality is PSNR against the captured frames (higher is closer; above about 35 dB differences are hard to see).

Encoder settingsSizeQualityTime
insightsEncoding the four variants…
The same frames as a videoRecords the same captured frames in real time with your browser’s video encoder, so it takes about: s. Video codecs predict motion between frames, which LZW can’t.
~/inside-your-gif

Your GIF, block by block, and why 24 fps isn’t quite 24.

A GIF89a file is a header, a screen descriptor, an optional colour table, then a run of blocks: an extension saying how long to show the next image, the image itself, and so on. Click a block to see its bytes.

OffsetBlockBytes
encoding…
Frame delays are whole hundredths of a second
AskedDelays written (cs)AveragePlays at
10 fps10 every frame10.00 csexactly 10 fps
12 fps8, 9, 8, 8, 9, 8, 8, 9, 8, 8, 9, 88.33 csaverages 12.00 fps, frames 80-90 ms
15 fps7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7 …6.67 csaverages 15.00 fps, frames 60-70 ms
20 fps5 every frame5.00 csexactly 20 fps
24 fps4, 4, 5, 4, 4, 4, 4, 4, 5, 4, 4, 4 …4.17 csaverages 24.00 fps, frames 40-50 ms
25 fps4 every frame4.00 csexactly 25 fps
30 fps3, 4, 3, 3, 4, 3, 3, 4, 3, 3, 4, 3 …3.33 csaverages 30.00 fps, frames 30-40 ms
50 fps2 every frame2.00 csexactly 50 fps
60 fps2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2 …1.67 csframes of 1 cs become 10 cs in browsers: plays far slower
This page spreads the rounding across frames (e.g. 4, 4, 4, 4, 4, 5 cs for 24 fps) so the total length stays right. Browsers treat delays of 0 or 1 cs as 10 cs, from old behaviour sites relied on, so 60 fps GIFs play at 10 fps in places.
~/reference

GIF89a at a glance.

Every block type in the format, with the ones this page writes marked. Limits come from the field sizes in the 1989 specification.

BytesBlockHolds
47 49 46 38 39 61Headerwritten by this pageSignature and version, “GIF89a” or “GIF87a”.
(7 bytes)Logical screen descriptorwritten by this pageCanvas size, global table flag and size, background colour.
3 × 2ⁿGlobal colour tablewritten by this pageUp to 256 RGB entries shared by all frames.
21 FF 0BApplication extensionwritten by this pageNETSCAPE2.0 sub-block 1 = loop count; also used for XMP metadata.
21 F9 04Graphic control extensionwritten by this pageDelay, disposal method (0-3), transparency for the next image.
2CImage descriptorwritten by this pageFrame rectangle on the canvas, local table flag, interlace flag.
3 × 2ⁿLocal colour tablewritten by this pageOptional palette for a single frame.
(min code + sub-blocks)Image datawritten by this pageLZW codes of 3-12 bits packed into ≤255-byte sub-blocks.
21 FEComment extensionwritten by this pageFree text, ignored by decoders.
21 01Plain text extensionwritten by this pageText rendered on a grid: almost no decoder supports it.
3BTrailerwritten by this pageEnd of file.
Hard limits
Canvas width or height65,535 px
Colours per table256
LZW code length3-12 bits (4,096 codes)
Frame delay step0.01 s, max 655.35 s
Loop count (NETSCAPE2.0)0-65,535 (0 = forever)
Transparent colours per frame1 index, on or off
Your GIF…
Timeline
1984Terry Welch publishes LZW, refining Lempel and Ziv’s 1978 dictionary method; Unisys holds the patent.
1987CompuServe releases GIF87a, designed by Steve Wilhite.
1989GIF89a adds the graphic control extension: delays, transparency and disposal.
1994Unisys announces licence fees for LZW in GIF software; work on PNG begins in response.
1995Netscape Navigator 2.0 adds the NETSCAPE2.0 looping extension.
1996PNG 1.0 becomes a W3C Recommendation, with no animation.
2003The US LZW patent expires (June); the last foreign ones lapse in 2004.
2012Oxford American Dictionaries names “GIF” (the verb) word of the year.
2013Wilhite receives a Webby lifetime award and says it is pronounced “jif”.
2014Twitter starts converting uploaded GIFs to MP4.
2014libwebp adds animated WebP encoding.
Platform dates are from general knowledge of press coverage; check before citing.