Use

still

gifgrep still

Extract one frame from a GIF as a PNG. Works on local files or URLs, no provider key required.

gifgrep still <gif> --at <duration> [-o <file>|-]

#Examples

# First frame as still.png
gifgrep still cat.gif --at 0 -o still.png

# 1.5s into the GIF, write to stdout (suitable for piping)
gifgrep still cat.gif --at 1.5s -o - > frame.png

# Pull a remote GIF and grab a frame at 250ms
gifgrep still https://example.com/cat.gif --at 0.25s -o cover.png

# Open the result in Preview/Finder after writing it
gifgrep still cat.gif --at 0 -o cover.png --reveal

#Flags

--at <duration>            timestamp; e.g. 0, 0.5, 1.5s, 2500ms
-o, --output <file|->      output path (default: still.png), '-' for stdout
--reveal                   open the resulting file in your file manager
-q / -v / --no-color       standard logging flags

--at accepts seconds (1.5, 1.5s) or milliseconds (250ms). If you ask for a timestamp past the GIF's total duration, the last available frame is used.

#How frame timing works

GIFs encode per-frame delays (in centiseconds). gifgrep accumulates these deltas to map your --at value onto the closest preceding frame. There's no resampling — you always get a frame that actually exists in the source.

For a denser look at the GIF, see sheet.

#Writing to stdout

-o - pipes raw PNG bytes to stdout. Combine with anything that expects PNG on stdin:

gifgrep still cat.gif --at 0 -o - | pngquant - > cat-tiny.png
gifgrep still cat.gif --at 0.5s -o - | imagemagick convert - cat.jpg

In that mode, all human-facing output stays on stderr.