Culling

Focus Monitor.

Focus Monitor is a 100 % crop centred on the actual autofocus point reported by the camera — not the centre of the frame. It lets you check whether focus actually landed where the camera intended it to, without zooming and panning.

How it works

For each image, the first time you toggle Focus Monitor on:

  1. SpeedCull invokes ExifTool to read AF-related tags from the RAW
  2. AFPointParser turns those tags into an AFRegion in image-pixel coordinates (top-left origin) — handling brand-specific encoding and reference-frame rescaling
  3. The parsed region is cached in SQLite (focus_metadata table)
  4. A 100 %-zoom JPEG crop centred on the AF region is rendered and cached to disk
  5. An on-screen overlay shows the crop with a green / yellow / orange confidence dot

Subsequent views of the same image are instant — the parse is cached in the database and the JPEG crop is on disk.

Brand support

Three brand families are supported in 0.1, each via a distinct tag path:

BrandSource tagsNotes
Canon Composite:AFAreaXPosition + AFAreaYPosition (+ AFAreaWidth, AFAreaHeight) Pre-normalised by ExifTool to image-pixel space — most reliable path
Sony MakerNotes:FocusLocation Reference frame may differ from sensor; SpeedCull rescales to actual image dimensions
Fuji MakerNotes:FocusPixel X / Y in image-pixel space

Other brands (Nikon, Olympus, Panasonic, Pentax, etc.) fall through to a centre crop. Adding more brands is a matter of extending AFPointParser.parse with a new branch — contributions welcome.

Real-RAW verification. AF parsing is unit-tested against synthetic tag dictionaries representing each brand’s expected output, but real-world ARW / CR3 / RAF testing is still happening. If your camera reports AF positions that don’t match where the crop ends up, file an issue with the camera model and a sample tag dump.

Using Focus Monitor

In Loupe

The PiP shows a 100 %-zoom crop centred on the AF point, with an outlined rectangle indicating the exact reported AF box scaled to the displayed crop. The header shows a confidence dot; the footer shows status text like Precise · Sony A7R V · Spot AF.

In Compare 4-up

With Focus Monitor on, each Compare tile shows a small focus crop in the bottom-right. Compare doesn’t generate crops — it only displays cached ones. Visit images in Loupe with Focus Monitor on once and the crops will be ready next time you compare them.

In Keeper Mode

F in Keeper Mode behaves the same as in Compare — cached crops show in the bottom-right of each pane; uncached ones don’t. Generate them by opening images in Loupe first.

Confidence indicators

The confidence dot tells you how reliable the AF position is:

PreciseAF position read directly with no inference
ApproximateAF position derived from less-direct tags or sentinel-rescaled
FallbackNo usable AF data; centre crop is shown
UnavailableExifTool wasn’t available, or the file produced no readable tags

The status footer also names the camera (when known) and the AF mode if it was reported, so a Sony spot-AF frame might read “Precise · Sony α7R V · Spot AF”.

Caching

AF results are cached at two levels for speed:

If you want to wipe the cache (e.g. after upgrading SpeedCull and wanting fresh AF parses): Cleanup screen → Delete focus crops. Crops will regenerate on next view in Loupe.

ExifTool requirement

Focus Monitor needs ExifTool. SpeedCull resolves the binary in this order:

  1. Bundled inside the app at SpeedCull.app/Contents/Resources/exiftool/exiftool
  2. Standard system paths: /opt/homebrew/bin/exiftool, /usr/local/bin/exiftool, /usr/bin/exiftool

In 0.1 ExifTool isn’t bundled inside the app yet — the simplest install path is Homebrew:

brew install exiftool

With ExifTool unavailable, Focus Monitor still works — it just falls back to a centre crop with the unavailable confidence indicator. AF-aware crops require ExifTool.

Troubleshooting

The crop is centred on the wrong spot

Possible causes:

It says “ExifTool not installed”

Run brew install exiftool. SpeedCull will pick it up next time you toggle Focus Monitor on (no app restart needed).

It’s slow on the first view

That’s the exiftool subprocess + RAW render cost. Subsequent views read from the cache and are instant. Pre-warm the cache by toggling Focus Monitor on in Loupe before going into Compare or Keeper Mode for that image.