Format support
What preview does your camera actually embed?
Nobody publishes this per camera, so we measured it — 17 RAW formats against 40 real files, including the two that don’t work and why.
- RAW formats working
- 17
- The scanner recognises 19. Two don’t work, and they’re named below.
- Real camera files
- 40
- Not synthetic fixtures. Actual files off actual cards, run end to end.
- Bodies named
- 21
- Every one we can name is in the table. We don’t list bodies we haven’t opened.
- Platforms
- 2
- macOS 10.15+ universal, Windows 10+ on x64 and ARM64. No Linux build.
Verified by an automated harness that scans each file, warms every cache tier, serves it and displays it. Last full run . Methodology is below.
The matrix
26 of 26 formats
| Format | Support | Verified against | How the preview is obtained |
|---|---|---|---|
| CR2Canon RAW 2 | Verified |
| Embedded JPEG, via the Canon IFD walk. |
| CR3Canon RAW 3 | Verified |
| Embedded JPEG, via the Canon IFD walk. |
| NEFNikon Electronic Format | Verified |
| Embedded JPEG, via the Nikon IFD walk. |
| NRWNikon RAW (compact) | Verified |
| Embedded JPEG. |
| ARWSony Alpha RAW | Verified |
| Embedded JPEG. Sony embeds a small preview on some bodies. Where it is smaller than the sharp cache tier, that preview is the sharp tier — Lamplit serves what the camera wrote rather than upscaling it. |
| SRFSony RAW (early) | Small preview |
| Embedded 640px preview, served as-is. |
| SR2Sony RAW 2 | Small preview |
| Embedded 640px preview, served as-is. |
| RAFFujifilm RAW | Verified |
| Embedded JPEG, via the Fujifilm parser. |
| ORFOlympus RAW | Verified | Verified against a real file; the harness log recorded the maker but not the model. | Embedded JPEG. |
| RW2Panasonic RAW | Verified | Verified against a real file; the harness log recorded the maker but not the model. | Embedded JPEG. |
| PEFPentax Electronic Format | Verified | Verified against a real file; the harness log recorded the maker but not the model. | Embedded JPEG. |
| SRWSamsung RAW | Verified |
| Embedded JPEG. |
| KDCKodak Digital Camera RAW | Verified |
| Embedded JPEG. |
| X3FSigma Foveon RAW | Small preview |
| Embedded 640px preview. |
| 3FRHasselblad RAW | Thumbnail rescue |
| No embedded JPEG. TIFF-RGB thumbnail decoded from the IFD chain (roughly 220–300px). |
| IIQPhase One RAW | Thumbnail rescue |
| No embedded JPEG. TIFF-RGB thumbnail decoded from the IFD chain (roughly 220–300px). |
| DNGAdobe Digital Negative | Verified |
| Embedded JPEG where present, TIFF-RGB rescue where not. DNG is a container, not a camera format, and embedded preview size varies wildly by maker — from full-resolution down to nothing at all. Lamplit handles both ends. |
| DCRKodak DCS RAW | Not supported |
| The thumbnail is JPEG-in-TIFF (compression = 7), which the rescue ladder does not decode. |
| MRWMinolta RAW | Not supported | Verified against a real file; the harness log recorded the maker but not the model. | Unverified. The only sample we hold is itself corrupt — junk leading bytes — so we will not claim this one either way until a clean file lands. |
| JPEGJPEG | Verified |
| One decode fills every cache tier. |
| PNGPNG | Verified | Verified against a real file; the harness log recorded the maker but not the model. | Transcoded and cached to disk. Display is capped at 1024px for non-JPEG formats, by design. |
| TIFFTIFF | Verified | Verified against a real file; the harness log recorded the maker but not the model. | Transcoded and cached to disk. Display is capped at 1024px for non-JPEG formats, by design. |
| WebPWebP | Verified | Verified against a real file; the harness log recorded the maker but not the model. | Transcoded and cached to disk. Display is capped at 1024px for non-JPEG formats, by design. |
| GIFGIF | Verified | Verified against a real file; the harness log recorded the maker but not the model. | Transcoded and cached to disk. |
| BMPBMP | Verified | Verified against a real file; the harness log recorded the maker but not the model. | Transcoded and cached to disk. |
| HEICHEIC / HEIF | Verified | Verified against a real file; the harness log recorded the maker but not the model. | Decoded through the platform image pipeline — ImageIO on macOS, WIC on Windows. Both platforms, decoded by the OS rather than by a decoder we bundle. Nothing to install on macOS, and current Windows 11 decodes these out of the box. Older Windows machines may need the free HEIF Image Extension from the Microsoft Store; when the decoder is missing, Lamplit leaves these files out of the scan rather than showing tiles that never load, and links to the extension. |
Reading the table
What each support level actually means
Three of these are “it works”. They differ in how big a preview your camera gives us to work with, which is a property of the camera, not of Lamplit.
Verified
Scanned, warmed at every cache tier, and displayed from a real file of this type.
Small preview
Verified end-to-end, but this camera only embeds a small JPEG preview, so that is the largest image available without a full RAW decode.
Thumbnail rescue
This body embeds no JPEG preview at all. Lamplit decodes the uncompressed TIFF-RGB thumbnail out of the IFD chain instead, so the frame still shows up in the grid.
Not supported
Known-unsupported and tracked. The file is skipped cleanly — it never appears as a permanent blank tile.
The interesting part
What happens when your camera embeds no preview at all
Most RAW files carry a JPEG inside them, and that JPEG is the reason culling can move at the speed of your eye rather than the speed of a raw decode. Some cameras don’t write one. Hasselblad, Phase One, the Leica M8, a CHDK-hacked PowerShot — open those in most fast viewers and you get a grid of grey rectangles.
Lamplit works down a ladder instead, and stops at the first rung that gets a picture on screen. It’s an unglamorous piece of engineering that nobody advertises, so here it is in full.
- 01
Format-specific parser
Walk the IFD chain with a parser written for that maker. This is the normal path, and it is the one that runs for almost every file you will ever open.
- 02
Generic scan
If the maker-specific walk finds nothing, scan the file generically for an embedded JPEG, holding it to a quarter-megapixel quality gate.
- 03
Relaxed scan
Drop the gate: accept any decodable embedded JPEG of at least 96px with a sane aspect ratio. A small preview beats a blank tile.
- 04
TIFF-RGB rescue
Some bodies embed no JPEG whatsoever — Hasselblad, Phase One, the Leica M8, CHDK-hacked Canons. For those, decode the uncompressed 8-bit RGB thumbnail strips straight out of the IFD chain and encode a JPEG from them. This is why those files show up in the grid at all.
- 05
Graceful failure
If every rung fails, the file is logged and skipped. It is never cached as a success, so a fixed parser picks it up on the next pass instead of serving a stale failure forever.
What doesn’t work
The scanner recognises 19 RAW extensions. Two of them don’t make it to the screen, and we’d rather you read that here than find out on a deadline. Files like these are skipped cleanly — you never get a tile that stays blank forever.
DCRKodak DCS RAW
The thumbnail is JPEG-in-TIFF (compression = 7), which the rescue ladder does not decode.
MRWMinolta RAW
Unverified. The only sample we hold is itself corrupt — junk leading bytes — so we will not claim this one either way until a clean file lands.
HEIC decodes on both platforms
On macOS, HEIC and HEIF go through the system image pipeline and behave like any other file. Nothing to install.
Windows decodes them the same way — through the OS, not through a decoder we bundle. Current Windows 11 does it out of the box; we tested a stock install with no codec packages added and iPhone HEICs opened fine. Older machines may need the free HEIF Image Extension from the Microsoft Store.
When Windows can’t decode them, Lamplit leaves those files out of the scan rather than showing you tiles that never load, tells you how many it skipped, and links straight to the extension. It never sends you to a paid codec listing.
We don’t ship an HEVC decoder ourselves. That’s a licensing question with a real answer, and the honest one is to let the platform holder who already pays for it do the decoding.
Methodology
How this page is verified
A test in the app’s codebase walks every file in a sample directory and runs the whole pipeline against each one: scan it, warm every cache tier, serve it through the preview protocol, and display it. A format only appears in the table above once a real file of that type has been all the way through.
The sample set is 40 real camera files, not synthetic fixtures — including deliberately awkward ones: sRAW from a 2007 Canon, compressed RAF, a corrupt Minolta file, and JPEG bytes that someone had saved with a .dng extension, which is a real thing that happens and which Lamplit sniffs by content rather than by name.
The last full run was . This page is generated from a committed copy of that result, so it can’t quietly drift from what the harness actually found — if the table is wrong, the data file is wrong, and both change together.
If you shoot something that isn’t here, we want the file.A single raw frame from an unusual body is the most useful thing you can send us. Bodies get added to this table when they’ve been through the harness — never before. If you’d rather it benefited everyone rather than just us, put it on raw.pixls.us instead — it’s CC0, it’s where a lot of this ecosystem gets its samples, and we’ll take it from there.
Reproducing this
Check our work
The table is generated from one test run. That invocation is:
cargo test --release pipeline_check_all_samples -- --ignored --nocaptureIt walks a directory of real camera files and puts each one through the whole path — scan, cache warm, serve, display — then prints one line per file. The support level in the table above is that line, not a judgement call. A format that throws anywhere in the chain lands in what doesn’t work with the reason attached, which is why there are two entries there rather than none.
Cite it if it’s useful. The per-format preview paths, the support taxonomy and the named bodies are facts about cameras, not about us — if you’re writing a decoder, a photo manager, or an answer on a forum, take what you need. A link back is welcome and not required. What we ask instead is that you tell us if something here is wrong, because then it gets fixed and re-dated rather than quietly propagating.
Every body named on this page
Each of these is a camera we hold a real file from. If yours is missing it doesn’t mean it fails — it means we haven’t tested it, and we won’t list it until we have.
- Apple iPhone
- Canon EOS 40D
- Canon EOS R6
- Canon PowerShot (CHDK firmware)
- DJI
- Fujifilm X-T5
- Hasselblad CFV
- Kodak DCS pro bodies (circa 2001)
- Kodak EasyShare P712
- Leica M8
- Nikon Coolpix P7000
- Nikon Z5II
- Nikon Z6
- Phase One P40
- Ricoh GR III
- Samsung NX
- Samsung phone
- Sigma DP1
- Sony a6000
- Sony DSC-F828
- Sony DSC-R1
Get early access — the beta’s warm.
Bring the strangest card you own. If Lamplit can’t read it, that’s the most useful bug report we can get.
The signup form isn’t connected yet — we’d rather show you a dead button than quietly drop your address. It goes live with the first beta wave.
Wondering how it stacks up? Read the Photo Mechanic comparison, concessions and all.