Skip to content

Make GIF from Photos on Mac

Make GIF from photos on Mac with FFmpeg: sort frames, set fps, resize, and palette encode, or use GetCompress for preview and batch export.

By Petr Samokhin

Design handed you twelve PNG frames for a micro-interaction storyboard. The client wants a looping GIF for Slack, not a PDF sheet. You could drop frames into a slide deck, but the thread asked for motion. Building a GIF from still photos means setting frame rate, resizing to display width, and running a palette pipeline so gradients do not band. Processing locally keeps unreleased product shots off random upload sites. Marketing and design teams that ship storyboard loops each sprint benefit from one saved preset instead of rebuilding FFmpeg commands per campaign.

When a photo slideshow GIF makes sense

GIF from photos works for short loops: storyboard walkthroughs, before/after sequences, loading-state mockups, and event photo highlights under ten frames.

Good fit for photo GIFBetter as another format
5 to 15 frame storyboardMP4 slideshow with music
UI state sequence from exportsPrototype video from Principle
Short meme-style flipbookLong photo album

GIF caps at 256 colors per frame. Photo sequences with skin tones, skies, and shadows need palette tuning or they band fast. See lossy vs lossless compression when you choose between palette quality and file size.

Frame countTypical fps
3 to 5 frames2 to 4 fps (hold each shot)
6 to 12 frames4 to 8 fps
12+ frames8 to 10 fps max

For motion from actual video, see video to GIF on Mac instead of stacking stills. For shrinking the finished GIF, see compress GIFs on Mac .

Ask whether MP4 works before you spend an hour on palette flags. A Ken Burns MP4 from the same JPEG sequence is often smaller and sharper for doc tools that accept video.

Prepare your photo sequence

Consistent frame size produces cleaner loops. Mixed dimensions force FFmpeg to scale or pad, which adds artifacts.

  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. Resize in Preview if exports are oversized for the target channel.
Export width from designTarget for Slack GIF
4000 px canvasScale to 800 px wide
1920 px artboard960 or 800 px wide
640 px componentKeep width

Use PNG for flat UI frames with text. Use JPEG for photo-heavy sequences when slight loss is acceptable and you need smaller source files before GIF encoding.

Remove duplicate frames at the end of the sequence when the loop should restart cleanly. The first and last frame should match visually for seamless loops, or accept a visible jump.

Store frames in a dedicated folder. Avoid spaces in filenames; FFmpeg glob patterns break on messy names.

Check one middle frame in Preview for retina sharpness before you batch the whole sequence.

Build a GIF with FFmpeg

Open Terminal (Applications → Utilities → Terminal). Install FFmpeg through Homebrew (install Homebrew first if brew is not found):

brew install ffmpeg

From numbered PNG frames with palette pipeline:

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

From a folder of JPEG files with glob pattern:

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

Reverse loop (ping-pong) for seamless motion without matching first/last frame:

ffmpeg -framerate 4 -i frame-%03d.png -vf "scale=800:-1,split[s0][s1];[s0]palettegen[p];[s0]reverse[r];[s1][p]paletteuse[u];[u][r]concat=n=2:v=1:a=0" -loop 0 pingpong.gif
ParameterSlower loopFaster loop
-framerate2 to 36 to 8
scale width640 px960 px
Frame countFewer framesMore frames

Lower -framerate when stakeholders want each storyboard panel readable. Raise it only when motion between panels should feel continuous.

After export, check file size in Finder. If the GIF exceeds your upload cap, re-run with scale=640:-1 and -framerate 3 before you drop frames.

Using GetCompress

GetCompress fits make GIF from photos on Mac when you want preview, ordering, and palette export without shell glob patterns.

Drop a folder of PNG or JPEG frames, or mix stills with timing controls in the UI.

Workflow features that help:

  • Preview and trim: adjust effective duration per frame before palette limits colors.
  • Frame-by-frame GIF preview: catch banding on photo gradients before you post.
  • Width presets: 640 or 800 px covers most Slack and doc uploads.
  • Batch queue: build several storyboard loops after a design review.
  • Switch to MP4: export video when the thread allows it instead of GIF.
  • Local processing: keep unreleased product shots off online converters.

Save a preset like “storyboard GIF 800w 4fps” when your team ships the same frame count each sprint. When photo GIF banding persists at 640 px, export MP4 from the same frame sequence or reduce frame count instead of re-palette encoding three times.

GetCompress also helps when design drops twenty PNG exports named inconsistently. Sort in the queue, set fps, preview the loop, and export one GIF without renaming files manually for FFmpeg %03d patterns.

For still image optimization outside GIF workflows, see how to compress images on Mac when the handoff folder mixes HEIC, JPEG, and PNG alongside the frames you animate.

Keep source frames in a frames-src/ folder and write GIF output to gif-out/ so deploy scripts never overwrite design exports.

Document fps and width in your repo README so the next campaign matches the last storyboard loop settings.

Buy GetCompress now for local media compression with reusable presets and no media upload.