Lithophane

2026-05-15

Back

The lithophane is a nineteenth-century answer to a problem we no longer have. In 1827 a French porcelain works patented a way of encoding a photograph before photography existed: carve a thin plate so that bright regions of the image are recessed and dark regions stand proud, then fire it. Hold the plate in your hand and it looks like a piece of unglazed porcelain. Set a candle behind it and the image appears, in continuous greyscale, made entirely of how much light each region was willing to let through. No pixels, no screen. Brightness was literally thickness.

The technique survived for about a century as a parlor object, then quietly died with the lightbulb. A 60-watt incandescent is much brighter than a candle, and the new medium (the photograph, paper, the silver halide print) was easier in every way that mattered. The lithophane became a footnote you would meet once, in a museum case in Limoges, and forget.

It turns out that FDM 3D printers are essentially purpose-built to make lithophanes. A 0.4 mm nozzle laying 0.2 mm layers of white PLA can resolve a thickness field to about a tenth of a millimeter in Z, which is finer than the human eye can distinguish in transmitted light. The medium was sitting around waiting for a process. A small genre of online lithophane generators exists. None of them, as far as I can tell, ships a printable kit. They ship one tile, on the assumption that a tile is what you wanted.

The customizer at custom.ma-r-s.com/customize/lithophane ships a kit. The unit of output is a base, a sleeve, a lid, and up to fifteen 50×50×4 mm panels that drop into a comb of teeth inside the base. Slide the sleeve over the base, drop in the lid, set the assembly in front of a window or a phone flashlight, and the panels stack into a small backlit gallery. Everything happens in the browser. No server, no account.

Brightness becomes thickness

The pipeline is a sequence of lossy steps, each one a choice. The upload is downsampled to 1024 px on the longest edge and persisted to localStorage so the kit survives a refresh. The user crops a square. The crop is rasterised, at 350 px on desktop or 200 px on mobile, into a grayscale buffer using Rec. 601 luma. That buffer is fed to buildLithophaneGeometry, which produces a mesh by treating every pixel as a vertex on a 50×50 mm grid and lifting it by inverse brightness: dark pixels become thick, bright pixels become thin. A 3 mm border is clamped to maximum thickness so the print has an opaque frame, and a flat back plus four side walls close the volume into something an STL writer accepts as a single manifold solid.

The interesting numbers are the thickness bounds. The panel runs from LITHOPHANE_BASE_MM = 0.6 at full white to LITHOPHANE_MAX_MM = 4.0 at full black, with a contrast multiplier that scales the band. Both bounds are empirical, and both fail in interesting ways if you violate them. Thinner than about 0.6 mm and the printer's three wall perimeters cannot fully overlap; the layer becomes a single shell with visible between-the-walls gaps that read as horizontal banding when backlit. Thicker than about 4 mm and the dark regions absorb so much light that no household source pushes through. You get a panel whose bright regions glow and whose dark regions disappear into the wall behind it. The eye reads this as a fragment, not a photograph.

The lithophane is the rare image format whose tonal range is set by the physics of the lamp it will sit in front of. Calibration is not optional. It is the medium.

From tile to kit

The first version of this tool exported a single tile. The first time I printed two of them I realised the tile is not the object. The object is the sequence. A landscape on its own is a souvenir; the same landscape next to a portrait of the person who was there with you, under the same light, behind the same frame, is something else. The format wants to be a small gallery, not a single picture, the way a roll of film wanted to be twenty-four frames rather than one.

The current customizer holds up to fifteen images. They share a base, a sleeve, and a lid; the base grows in 10 mm increments depending on how many panels you load. The 3D preview (Three.js via Threlte) animates the assembled kit while you tune each panel's contrast and crop independently. The export is a ZIP of binary STLs, one per part, plus a manifest that labels each panel by slot number so a non-technical user can find which file is which photograph. A single panel never leaves the kit; the unit of output is the gallery.

Live at custom.ma-r-s.com/customize/lithophane. Upload an image, drop the ZIP into your slicer, print white PLA at 0.2 mm layers, three walls, 100% infill. The technique is two hundred years old. The hardware is in your living room. The bridge between them is two thousand lines of TypeScript.

CC BY-NC 4.0 © ma-r-s

?