How to Extract Frames from a GIF
First frame (this page)
- Upload the GIF in the converter above.
- Convert to JPG. Transparent areas become white, and the JPG quality is 92.
- Download the still image. For lossless pixels or transparency, convert the GIF to PNG instead.
All frames with FFmpeg
ffmpeg -i input.gif -fps_mode passthrough frame_%03d.png writes frame_001.png, frame_002.png and so on: one full picture per GIF frame. Older FFmpeg versions use -vsync 0 instead of -fps_mode passthrough.
All frames with ImageMagick
magick input.gif -coalesce frame_%03d.png. The -coalesce option matters: many GIFs store only the changed part of each frame, and without it you get partial, broken-looking images. With ImageMagick 6, use convert instead of magick.
Photoshop
Open the GIF (each frame becomes a layer), then use File → Export → Layers to Files to save every frame as PNG or JPG.
GIF Format Overview
GIF (Graphics Interchange Format) was created by CompuServe in 1987 and remains in use today primarily because of one feature: animation. GIF is the only widely-supported image format that plays animated sequences in all browsers, email clients, and messaging apps without requiring video playback.
GIF's technical limitations are significant: 256 colors maximum per frame (from a palette-based system), binary transparency only (fully opaque or fully transparent, no partial transparency), and LZW compression that produces large files for photographic content.
GIF to JPG: When and Why
Converting GIF to JPG makes sense when:
- Photographic content stored as GIF: Legacy systems sometimes save photos as GIF. JPG provides 16.7 million colors vs GIF's 256.
- Extracting a still frame: Converting animated GIF to JPG extracts the first frame as a static image — useful for thumbnails and previews.
- Format requirements: Some upload forms require JPG specifically.
- Smaller file size: For photographic content, JPG is typically much smaller than GIF.
Important: Converting an animated GIF to JPG extracts only the first frame. All animation is lost. If you need to preserve animation, convert the GIF to MP4, which keeps every frame.
GIF to PNG: The Better Choice for Graphics
For most GIF content (logos, icons, graphics, screenshots), PNG is the superior target format:
- Lossless quality: PNG preserves exact pixel data, no compression artifacts
- Full transparency: PNG supports alpha channel (256 levels) vs GIF's binary transparency
- Better compression: For flat-color graphics, PNG is often smaller than GIF
- More colors: PNG supports 16.7 million colors (24-bit) vs GIF's 256
Animated GIF Warning
This is the most important thing to understand: converting animated GIF to JPG or PNG produces a single static image (the first frame). The animation is permanently lost in the conversion.
If you need to preserve animation:
- Animated WebP: about 64% smaller than GIF in lossy mode. Our GIF to WebP converter keeps all frames, so the animation survives
- GIF to MP4: Dramatically smaller files for web video playback
GIF vs JPG vs PNG Comparison
| Feature | GIF | JPG | PNG |
|---|---|---|---|
| Colors | 256 | 16.7 million | 16.7 million |
| Animation | Yes | No | No (APNG limited) |
| Transparency | Binary | No | Full alpha |
| Compression | LZW lossless | DCT lossy | DEFLATE lossless |
| Best for | Simple animations | Photos | Graphics, screenshots |
When GIF Still Makes Sense
Despite its age and limitations, GIF remains relevant for:
- Email animations: GIF is the only animated format supported by all email clients
- Messaging: Universal support in iMessage, WhatsApp, Telegram, Discord
- Memes and reactions: Cultural standard for short animated content
- Maximum compatibility: 100% browser and app support, no exceptions
How to Count a GIF’s Frames and Find Its FPS
magick identify input.gifprints one line per frame, so the number of lines is the frame count.magick identify -format "%T\n" input.gifprints each frame’s delay in hundredths of a second. Frame rate = 100 ÷ delay: 10 means 10 fps, 4 means 25 fps.ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of csv=p=0 input.gifgives the frame count with FFmpeg’s tools.