WebP Frame Extractor
How it works
Pick an animated .webp, .gif, .apng or .avif file and the page splits it into one image per frame, packaged as a single ZIP. Nothing is uploaded. The decoding, the re-encoding and the archive are all built by JavaScript inside your browser tab, and the DevTools Network tab stays empty while you work.
An animated WebP or GIF is not a video, and browsers treat it that way: a `<video>` element refuses to play one however video-like it is. The only browser API that hands the frames over one at a time is ImageDecoder, and that is what this page uses. It ships in Chrome and Edge 94 and later. Firefox and Safari have not implemented it, so there the page says so and tells you to convert the file to MP4 or WebM first, rather than failing quietly.
Per-frame delay is read, not assumed. GIF and WebP store a display duration on every frame, and it does not have to be the same for all of them: a 20-frame GIF can hold 19 frames at 40 ms and one final frame that sits for two seconds. Splitters that assume a constant rate get the timeline wrong from the first irregular frame onward. This one reads each frame's own duration and walks the source timeline once, emitting an output frame for every target timestamp that falls inside the current source frame. Ask for a higher frame rate than the source and frames repeat; ask for a lower one and frames are skipped. No source frame is ever decoded twice, which matters because GIF and WebP frames are delta-encoded against their predecessor, so jumping around inside the file is expensive.
Getting exactly the frames that are in the file. Set the FPS slider to the animation's own rate. Once you pick a file the page prints its name, its duration in seconds and its pixel dimensions, and under the settings it keeps a running estimate that reads `≈ N frames`. Frame count is duration times frame rate, so a 2.0 s animation at 25 fps is 50 frames. Move the slider until the estimate matches what you expect and you get a one-to-one split: one image out per frame in, in order.
The four output settings, each of which re-prices the estimate as you change it: • FPS, 1 to 60, default 24. This is the rate you want out, not the rate the file was made at. • Output width: Original, 1920, 1440, 1080, 720, or a custom value from 64 to 7680 px. Height follows the source aspect ratio, so a 500×500 sticker stays square. • Format: JPG or WebP. There is no PNG output. WebP is the smaller of the two at the same visible quality and every current browser decodes it; JPG is the safer pick when the frames are going into older software. A still WebP frame is a different thing from the animated WebP you started with. • Quality, 0.10 to 1.00, default 0.85. 0.85 is the usual sweet spot, 1.00 is near-lossless and much larger, and below about 0.6 the blocking becomes visible on flat colour, which GIF sources have a lot of.
What comes back. Frames are named `frame_0001.jpg`, `frame_0002.jpg` and so on, zero-padded to four digits, so they sort correctly in Finder, in Explorer, in a shell loop and in an ffmpeg glob pattern without any renaming. The extension follows the format you chose. The archive itself downloads as `frames.zip`.
Limits. The page warns when a run would produce more than 1000 frames and refuses above 2500. Both numbers are about memory: the ZIP is assembled in RAM before the download starts, and a few thousand full-width frames will take the tab down. If you hit the ceiling, lower the FPS, pick a smaller output width, or cut the source in two.
How this differs from an online GIF splitter. Tools like ezgif work server-side: the file is uploaded, split there, and returned as a page of thumbnails you download one by one or as an archive, under whatever size limit the server sets. Here the file never leaves the machine, there is no queue and no size cap beyond your own memory, you choose the sampling rate and the output size rather than taking the source frames as they are, and the result arrives as one ZIP with sortable filenames. The cost is browser support: a server-side splitter runs anywhere, and this needs Chrome or Edge for animated input.
Video files work here too, and the file picker lists them after the animated formats. MP4, WebM, MOV and anything else your browser can play go down a different internal path (WebCodecs, or a slower seek-based fallback on browsers without it), but the settings and the output are identical. If a video rather than an animation is what you usually have in hand, the Video Frame Extractor on this site is the same engine with video-first settings and copy.
Frequently Asked Questions
How do I split an animated WebP into frames?
- Pick the .webp file, set the FPS slider to the animation's own frame rate, and press Extract. You get a ZIP of numbered images, one per frame, named frame_0001 upward. Setting the FPS higher than the source rate duplicates frames and setting it lower skips them, so matching the rate is what gives you a clean one-to-one split.
How many frames does my animated WebP or GIF have?
- Multiply the duration by the frame rate. The page prints the duration in seconds as soon as you pick the file, and shows a live estimate reading approximately N frames for whatever FPS you have set, so a 2.0 s animation at 25 fps is 50 frames. Slide the FPS until the estimate stops moving around the value you expect and the split comes out one image per source frame.
Can I get the frames as PNG?
- No. The Format dropdown offers JPG and WebP only, because those are the two a browser canvas encodes natively everywhere this page runs. Pick WebP if the frames have transparency or flat colour, since it is lossless-friendly and smaller, then convert the extracted files afterwards if a later step insists on PNG.
Why does it say my browser cannot decode the file?
- Because animated images need the ImageDecoder API, which only Chrome and Edge 94 and later have shipped. Firefox and Safari can display an animated WebP but cannot hand a page its individual frames. The message appears before you spend any time on it and tells you to convert the file to MP4 or WebM, which then goes down the video path and works in every browser.
Does it handle a GIF with variable frame delays?
- Yes. Every frame's own display duration is read out of the file and used to place it on the timeline, so a GIF that holds its last frame for two seconds resamples correctly instead of being stretched to an even rate. Splitters that assume one constant delay for the whole animation shift every frame after the first irregular one.
How is this different from ezgif's WebP or GIF splitter?
- It runs on your machine instead of on a server. ezgif uploads the file, splits it, and returns a page of thumbnails within a server-set size limit. Here nothing is uploaded, there is no size cap beyond your own memory, and you choose the sampling rate, the output width, the format and the quality rather than taking the source frames as they are. The trade is browser support: ezgif works anywhere, this needs Chrome or Edge for animated input.
Can I extract frames from an APNG or an animated AVIF?
- Yes. .apng and .avif go through the same ImageDecoder path as .webp and .gif, with the same settings and the same ZIP. APNG carries 24-bit colour and an 8-bit alpha channel, so its frames survive the round trip better than a 256-colour GIF's do. Safari reports an empty MIME type for .apng, so the file extension is what identifies the format here.
Are my files uploaded anywhere?
- No. Decoding, resizing, re-encoding and the ZIP all happen inside your browser tab. Open DevTools, watch the Network tab, and extract: no outbound request fires. That is the reason to use this rather than a server-side splitter for anything covered by an NDA.
What is the maximum number of frames?
- 2500, with a warning above 1000. The archive is assembled in memory before the download starts, so a few thousand 1920 px frames is enough to exhaust the tab. If you hit the cap, drop the FPS, choose a smaller output width, or split the source and run it twice.
Can I use a video file on this page too?
- Yes. MP4, WebM, MOV and anything else your browser can play work here, they just sit below the animated formats in the file picker. Video goes through WebCodecs, or a slower seek-based fallback on browsers without it, instead of ImageDecoder, but the FPS, width, format and quality controls and the ZIP output are identical.
Animated image formats: what each one carries
The four animated formats this page reads, and what survives when one is split into stills.
| Format | Colours per frame | Transparency | Typical size vs GIF | Browsers that animate it |
|---|---|---|---|---|
| GIF | 256, from a palette | 1-bit: a pixel is transparent or it is not | Baseline, 100% | Every browser since 1995 |
| Animated WebP | 16.7M, 24-bit | 8-bit alpha, 256 levels | 35–65% smaller | Chrome 32+, Firefox 65+, Safari 14+ |
| APNG | 16.7M, 24-bit | 8-bit alpha, 256 levels | 10–40% smaller | Firefox 3+, Safari 8+, Chrome 59+ |
| Animated AVIF | 10-bit and up, HDR capable | 8-bit alpha or better | 50–80% smaller | Chrome 85+, Firefox 113+, Safari 16+ |
Size figures are typical ranges for the same source animation and swing widely with content: flat cartoon cells suit GIF's palette, photographic frames suit WebP and AVIF. The browser column is about displaying the animation. Splitting one into frames on this page needs the ImageDecoder API instead, which is Chrome and Edge 94 and later only.