Pull stills out of a video, up to its own full resolution, and get them all as one ZIP with a contact sheet showing the timecode under every shot. Free, no signup, and your video is never uploaded.
Grabbing a still out of a video in a browser looks trivial and is not. If a page copies the video onto a canvas the instant it sets a new time, it copies whatever was on screen a moment earlier, so you end up with the same picture twice or a black rectangle. This page waits for the browser to confirm the seek actually finished, and then, where the browser can report it, waits again for the decoded frame to be presented before it copies anything. That is the whole difference between a usable proof sheet and a folder of duplicates.
One image per frame at the width you chose, up to the video's own native size, each named with its position and its timecode. One contact sheet as a single JPG with the time printed under every cell, which is the file to send a client when you want them to point at a shot. And a ZIP holding all of it, assembled in the tab on your own machine.
JPG is the right answer nearly every time. Video is already a lossy format, so a PNG of a video frame is not more faithful to the original, it is just three to five times larger, and a few hundred PNGs at 4K will run a browser tab out of memory. Choose PNG when the frame is going straight into a design tool for compositing, or when the footage is a screen recording made of flat colour and text, where PNG is both smaller and cleaner.
Everything is assembled in memory before the ZIP is handed to you, so there is a real ceiling and this page shows it before you commit rather than after. There are two separate limits. One run does at most 500 frames whatever the settings, and on top of that the projected size updates as you change the width, the file type and the number of frames. If the estimate turns amber, lower the width, switch to JPG, or ask for fewer frames until it turns back, and the estimate box will tell you which of those actually applies.
This page reads video through the browser's own decoder, so it can only open what the browser can already play. H.264 MP4 and WebM work everywhere. ProRes, DNxHD and most HEVC .mov files straight off a camera or out of Final Cut will not open in Chrome or Firefox, and the page will say so plainly instead of quietly writing blank frames. Put those through VLC or HandBrake into an H.264 MP4 first, then come back.
Your video is opened straight from disk and stays there. No frame, no contact sheet and no part of the file is uploaded anywhere. The page itself does talk to the network for two things that have nothing to do with your file: it loads two small libraries, one for writing ZIPs and one for saving them, from a public CDN, and it records the page address plus how many frames a run produced in our own visit counter. Your video, the frames and the contact sheet are not part of that.
Hunting thumbnail candidates before opening the YouTube thumbnail maker, sending a client a proof sheet of every shot in a cut, keeping the still of the exact moment a bug appears in a screen recording, and pulling reference images out of footage for a design. If you want a short moving loop instead of stills, the video to GIF converter is the page for that, and the video compressor is there when the file itself is too big to send.