Skip to content

Make GIF from Photos on Mac: 3 Methods

Make a GIF from photos on Mac with GetCompress, Preview prep, or FFmpeg. Sort frames, set fps, resize, and palette-encode for Slack loops.

By Petr Samokhin

Design hands you a short PNG or JPEG sequence for a storyboard, UI state flip, or before/after loop. The channel wants a GIF, not a PDF sheet. You need matching frame sizes, a readable fps, and a palette encode so gradients do not band. Keep unreleased product shots on your Mac instead of uploading them to a random converter.

When a photo GIF makes sense

Good fitBetter as something else
5 to 15 frame storyboardMP4 slideshow with music
UI state sequencePrototype video from a design tool
Short flipbookLong photo album
Frame countTypical fps
3 to 52 to 4 (hold each shot)
6 to 124 to 8
12+8 to 10 max

GIF caps at 256 colors per frame. Photo skin tones and skies band quickly if you skip the palette step. For motion that already exists as video, see video to GIF on Mac . To shrink a finished GIF, see compress GIFs on Mac .

Method 1: GetCompress

Best for: Previewing the loop, fixing frame order, and exporting a width/fps preset without shell globs.

GetCompress GIF settings with quality, dimensions, and format options for animated GIF export
  1. Drop a folder of PNG or JPEG frames into GetCompress .
  2. Sort order in the queue if filenames are inconsistent.
  3. Set width (often 640 or 800 px for Slack) and fps.
  4. Preview the loop, then export GIF.

Save a preset such as “storyboard GIF 800w 4fps” when your team ships the same frame count each project. If banding persists, reduce width or frame count, or export MP4 when the channel allows it.

Method 2: Prepare frames in Preview

Best for: Cleaning oversized exports before any GIF encode.

  1. Export every frame at the same width and height from your design tool.
  2. Name files in sort order: frame-001.png, frame-002.png, and so on.
  3. Open oversized frames in Preview and resize to the target width (often 800 px for Slack).
  4. Store frames in a dedicated folder without spaces in filenames.
Export width from designTarget for Slack GIF
4000 px canvasScale to 800 px wide
1920 px artboard800 or 960 px wide
640 px componentKeep width

Use PNG for flat UI with text. Use JPEG for photo-heavy sequences when slight loss is acceptable before GIF encoding. Matching first and last frames helps the loop restart cleanly.

Limitation: Preview prepares stills. It does not assemble the animated GIF by itself.

Method 3: Build a GIF with FFmpeg

Best for: Exact palette flags and repeatable Terminal recipes.

brew install ffmpeg

Numbered PNG frames:

ffmpeg -framerate 4 -i frame-%03d.png \
 -vf "scale=800:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
 -loop 0 storyboard.gif

JPEG folder with a glob:

ffmpeg -framerate 3 -pattern_type glob -i 'frames/*.jpg' \
 -vf "scale=800:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
 -loop 0 slideshow.gif
LeverSmaller GIFClearer panels
-framerate2 to 3Hold readable shots
scale width640 px800 to 960 px
Frame countFewer framesKeep only needed states

Check Finder file size after export. If the GIF still exceeds the upload cap, re-run at 640 px and 3 fps before you drop frames.

Limitation: You maintain the commands. Messy filenames break glob patterns.

Which method should you use

SituationStart here
Preview, presets, or messy filenamesGetCompress
Oversized design exportsResize in Preview, then Method 1 or 3
Exact palette flags or scriptsFFmpeg

When MP4 is the better loop

Ask whether the channel accepts MP4 before you fight palette banding. An MP4 from the same sequence is often smaller and sharper.

GetCompress fits when you ship storyboard GIFs often and want preview before palette limits hit. Keep source frames in frames-src/ and write GIF output to gif-out/ so you never overwrite design exports. For stills outside GIF work, see how to compress images on Mac .