3D printing · No upload

Make a lithophane STL from a photo on your device

Turn a photo into a binary STL where dark parts of the picture are thicker and light parts thinner.

Tone ladder: sampled model preview

    

Each rung samples an input brightness and shows its rounded model thickness and the light the model predicts through it, relative to the minimum thickness you set. The ladder shows at most twelve rungs; rows can repeat thickness levels or skip others, so it is not a list of every distinct level.

Statusidle Files— Image— Pixels— Width/arc × height— Thickness steps— Tone— Detail— Triangles— STL size— Network since file read—

A binary STL from luminance alone: colour is discarded and a transparent region reads as black. Refused by name: under 16 pixels on a side or an image the browser cannot decode; fewer than 2 grey levels by the thickness-step count or over 2,200,000 triangles with Build withheld. One photo at a time. Takes .jpg, .jpeg, .png and .webp.

How this lithophane maker works

Your browser decodes the picture and scales it to the mesh grid with its high-quality image filter, and each sample is read as a Rec. 709 luma value. Colour is discarded, because a lithophane carries its picture in thickness alone. Dark samples become thicker material and light samples thinner material, and the picture appears when light shines through the plate from behind.

Each sample becomes one grid vertex, with its thickness rounded to a multiple of the layer height you entered. A flat plate gets a front surface, walls around its border and a back fanned from one corner across the same border ring, which gives each edge two adjoining triangles. A curved plate is a half cylinder with a second full surface for its back, so it needs nearly twice as many triangles; the readout shows the count before you build. For a curved plate, the width you enter is the outer arc length, and the height still follows the photo’s aspect ratio. Triangles are written straight into the binary STL as they are generated, so even a two-million-triangle mesh does not need an intermediate triangle array.

Detail sets the number of mesh cells across, capped at the photo’s pixel width. A grid of nx by ny cells uses (nx+1) by (ny+1) sampled vertices, so that cap is not a promise of no upsampling. The step count comes from the thickness range and layer height before rounding; rounding can change how many thickness levels are available, and a photo may use fewer. The minimum and maximum are bounds before rounding, so a rounded thickness can fall outside them, and the ladder’s light figures are relative to the minimum you set, which need not be the thinnest part of the model. Those figures come from an attenuation model for white PLA, so they show the shape of the modelled tone curve; actual banding and contrast depend on your material, print settings and backlight. Sampling finer than the nozzle is flagged because the printer may not reproduce that detail. The page does not simulate your slicer, bed adhesion or light source, so a good preview can still print badly.

Frequently asked questions

Is my photo uploaded anywhere?
No. Your browser decodes the image, and JavaScript in this tab works out the luminance, the thickness map, the mesh and the STL bytes. Once the page and its code have loaded, there is no converter library to download. The meter counts resource-timing entries after file reading begins; it does not see earlier page downloads or every network channel. The methodology page explains the meter and describes browser network checks and an offline conversion test.
Why does my lithophane print in visible bands?
Because thickness carries the picture, and the layer height rounds it into steps. At 0.8 mm to 3.0 mm with a 0.2 mm layer height, the settings allow twelve thickness levels, and a photo may use fewer. That is a geometry count; the number of greys you can tell apart in the print can be lower. A thinner layer or a wider thickness range can allow more levels; a larger source image does not. The Thickness steps readout gives the count for your settings before rounding. Filament, printer, orientation and lighting also affect visible banding.
What thickness and layer height should I use?
Start with a thickness range of 0.8–3.0 mm. The layer height sets how many steps fit in that range: 0.08 mm gives more levels than 0.12 mm, and can take longer to print. For a flat plate, printing flat on the bed with no supports and 100 percent infill is a starting configuration to check in your slicer; for a curved plate, choose orientation, supports and infill for your model and printer. Sparse infill can show up as a pattern when the print is lit from behind, and changing the orientation changes how the thickness steps are printed.
Why is there a tone setting, and which one should I pick?
Because light falls off exponentially as it passes through material, so an even thickness ramp gives an uneven brightness ramp. The linearised setting uses that attenuation model to choose a thickness curve that makes the modelled transmitted light rise close to evenly with image brightness; try it for photographs. The straight setting maps brightness to thickness with no correction, for when you want that mapping. The attenuation constant is a model value for white PLA, so print a small test piece before relying on how the result looks.
Which image formats work here?
JPG, PNG and WebP, decoded by your browser without an extra image library. Other files, and files the browser cannot decode, are refused by name. The mesh takes its thickness from the decoded image’s luma and does not print the source colours. A greyscale copy made in another program may convert tones differently, so it can produce different geometry.

Related tools