Something I kept running into with 3D Sliced Image work, and a free tool I wrote to deal with it. Posting the mechanism first because it’s worth knowing whether or not you want the tool.
The problem
A greyscale depth map can declare 16 bits per sample and contain only 8 bits of real depth information. Three ways this happens, all common:
- Byte replication — an 8-bit value widened as
v × 257. Every level lands on a multiple of 257. Header says 16-bit, file is twice the size, depth resolution unchanged. - High-byte shift —
v × 256, low byte left at zero. - Quantised ladder — a 10-bit or 12-bit source stretched across the 16-bit range. Subtler, and the one that gets missed.
Nothing in the normal chain flags any of it. Image viewers show a smooth ramp. Photoshop reports 16 bits/channel because it’s reading the header. LightBurn imports it without comment, correctly — it has no reason to audit your file. The result shows up as terracing on the workpiece at pass counts that should have been fine.
AI relief generators produce these constantly, because their output stage writes 16-bit PNG regardless of what the model actually generated.
Why it matters here specifically
Number of Passes is the slice count, so it’s the real depth resolution. If the file carries 256 usable levels, raising the pass count past that buys nothing — you’re paying time for steps the data can’t fill.
Worth knowing too: LightBurn’s docs note that a 24-bit depth map is three 8-bit channels and displays as 8-bit. So grey data saved as RGB isn’t just wasted bytes on this path — it can cost precision the file appears to have.
The tool
DepthView counts what’s actually in the pixels. Free, MIT, no signup, single file, Windows/Mac/Linux — nothing to install.
Typical output screening a folder:
OK 16bit 56,299 levels step 1 coin-front.png
FAIL 16bit 256 levels step 257 coin-back.png
FAIL 16bit 1,024 levels step 64 logo-relief.png
step is the GCD of the gaps between occurring levels. Genuine data gives 1. A step of 257 or 256 is byte-widening; 64 is a 10-bit ladder. Exit code 1 when anything is flagged, so it drops into a batch script.
It also reports unused headroom (a map spanning 267–63,271 wastes passes at both ends), pure-black and pure-white pixel counts where depth has already been clipped away, and it renders a lit 3D preview with a terracing control you can set to your pass count.
The PNG decoder is hand-written rather than platform-supplied, because WIC, CoreGraphics and GDK all quietly hand back 8 bits for a 16-bit PNG — which would make the tool useless for the one thing it’s for. All bit depths, all colour types, Adam7, plus Netpbm and PFM.
Scope, so nobody downloads it expecting the wrong thing
It inspects and previews. It does not generate or export files — no invert, no remap, no quantise-to-pass-count, no .lbrn2. That’s roadmap, not shipped. And 3D Sliced Image mode is galvo-only, though the analysis applies to greyscale relief on any machine.
What I’d like back
If it reports something you believe is wrong about one of your files, please tell me — that’s the most valuable thing I can hear. The last fix came from exactly that: two genuine 16-bit maps of mine were being flagged when they shouldn’t have been, and no synthetic test case could have caught it, because a fixture with a known answer can tell you a measurement is wrong but never that a correct measurement is carrying the wrong emphasis.
Mac and Linux reports also welcome. Automated builds prove it compiles and analyses identically on all three platforms, but the file dialog, drag-and-drop and clipboard paste need a real person on a real machine.

