NC Imago · Docs

Focus points

Most cameras record where they focused. Imago reads that point from the file, draws it over the photo and zooms to it, so checking whether the subject is sharp takes one key while culling. A professional photo organizer shows no focus points (photographers add plug-ins for it); this goes beyond parity (tracker row LR-VIEW-FOCUSPOINT).

Using it

The point is read when a photo is imported. Photos imported earlier get it in the background (below). It is read-only camera data: never written to XMP, and absent from the catalog JSON when unknown, so older catalogs read unchanged (no catalog format change).

Photos imported earlier

A library imported before focus points were read gets them by itself: when a library opens and some of its photos from a supported body have no point and haven't been looked at, Imago reads them in the background, with a Reading focus points row in the activity stack (n of N; ✕ stops it). Photo ▸ Read Focus Points (photo.readFocusPoints) starts the same job by hand. Photo ▸ Reload from Disk still fills a missing point too, but it re-reads and hashes whole files and runs while you wait, so it is for a few photos, not a library.

Cameras

Sony first, on bodies whose files have been checked: ILCE-1 (α1) and ILCE-7SM3 (A7S III) (imago_meta::focus::SONY_MODELS). Other Sony bodies store the same tags, but a body is added only after its files are checked, so an unchecked one shows nothing rather than a misleading box. Fujifilm, Canon, Nikon, OM System and Panasonic record similar data and are later steps.

Sony layout and evidence

Tag identities and value names come from the public ExifTool tag-name documentation (Sony MakerNotes table). No third-party code was read or ported. Every field was confirmed on real files by comparing Imago's decoder with ExifTool's output, run as a black box: 333 ARWs sampled across four years of a photographer's library (180 α1, 153 A7S III; 12 portrait or upside-down, 54 in APS-C crop or reduced-size modes), with no mismatch in the point, frame or names.

MakerNote tag Layout Notes
0x2027 FocusLocation 4 × int16u: frame width, frame height, focus x, focus y in the sensor's landscape frame (a portrait shot still says 8640 × 5760); the frame is the image size (5616 × 3744 in α1 APS-C mode)
0x2037 FocusFrameSize 6 bytes: int16u width, int16u height, then 2 bytes that are zero when no frame was shown zero in manual focus; one AF-C α1 file had no frame (a small box is drawn: 3 % of the short side)
0x201b FocusMode int8u: 0 Manual, 2 AF-S, 3 AF-C, 4 AF-A, 6 DMF, 7 AF-D
0x201c AFAreaModeSetting int8u: 0 Wide, 1 Center, 3 Flexible Spot, 11 Zone, 12 Expanded Flexible Spot, 13 Custom AF Area
0x2021 AFTracking int8u: 0 Off, 1 Face tracking, 2 Lock On AF
0x9402 bytes 0x16 / 0x17 enciphered: focus mode (low 7 bits) and the AF area mode used (0 Multi, 2 Spot, 3 Flexible Spot, 11 Zone, 14 Tracking, 15 Face Tracking, 20 Animal Eye Tracking, 21 Human Eye Tracking, 255 Manual…) read only when its focus mode equals 0x201b's

The documentation says the 0x94xx blocks use "a simple substitution cipher". On the files each byte p < 249 is stored as p³ mod 249 (bytes 249–255 unchanged): ExifTool's decoded AFAreaMode 20 is stored as 0x20, a decoded 0x83 as 0x77. Cubing is a bijection modulo 249 (= 3 × 83), so the inverse is a table lookup.

On the α1 files the box sits on the subject: drawn on the embedded previews, it lands on the bird's eye in eye-AF shots and follows spot, zone, wide and tracking shots, in portrait and landscape.

When there is no real point

Nothing is stored (so nothing is drawn and Z zooms as before) when:

DMF (AF, then manual touch-up) keeps its point.

Code