What this actually builds
Two things happen to your picture. First the subject is separated from its background, which gives an outline. Then that outline is inflated: every point is pushed out by how far inside the outline it sits, so the middle bulges and the edge closes, and the same bulge is mirrored behind — a rounded solid with a front, a back and a sealed edge. The picture's own light and shade is laid over the surface on top of that, so a face still reads as a face.
It is worth being plain about what that is not. Nothing here knows what the back of your subject looks like, because a photograph does not say. What you get is the shape the outline implies, inflated — closer to a well-made soft toy of the thing than to the thing. For a logo, an icon, a leaf, a fish, a game asset, a fridge magnet or anything you are going to sculpt further, that is a real starting point and it prints. For an accurate model of a specific object you want photogrammetry from many angles or a scanner, and no amount of tuning here substitutes for one.
The other two shapes do something different and older: they lay the picture on a flat plate or wrap it around a cylinder as relief, with no attempt at a body. That is what a lithophane, a plaque, an engraved sign or a lamp shade is, and it is why they are still here.
From pixels to triangles
The picture is first reduced to a grid whose longest edge is the resolution you asked for. Each grid point averages a small window of the picture rather than reading a single pixel, so a photograph's noise is averaged away instead of being sampled at random — and the windows at the very edges are half as wide, because a point sitting on the border has picture on one side only. That is what keeps the geometry lined up with the texture stretched across it.
Anything transparent is composited over white before it is averaged. This matters more than it sounds: the colour hiding behind a fully transparent pixel is arbitrary — encoders leave black, white, or whatever the last opaque neighbour held — and letting it into the average draws a halo around every cut-out. Transparency itself survives the composite untouched, which is what leaves it usable as a height source of its own.
Each grid point then takes its height from the channel you chose, is optionally inverted, and is smoothed by however many blur passes you asked for. Smoothing is separable and clamped at the edges, so the border of the relief stays at the height the picture's border actually had rather than folding in the opposite side.
The heights are placed in space by the shape: a flat plate puts them along one axis, and a cylinder wraps them around an axis instead. Everything after that is identical for both — the same grid, the same triangulation, the same walls — which is the whole reason a second shape costs almost nothing.
With the solid backing on, a second surface is built directly behind the first, and the two are joined by a ring of walls. The walls are walked so the relief is always on the left as seen from outside, which is what makes every one of them face outward without a table of special cases. A cylinder has no left or right wall at all, because the picture's two edges are the same place on the model; its first and last columns are given the same height so the wrap closes rather than cracking open.
An inflated body's outline comes from transparency. A picture that already has a transparent background is its own outline and nothing else runs; a photograph does not, so a subject-segmentation model runs in this tab to find one. Its weights are fetched once from a CDN and cached by your browser afterwards — the size is on the control itself — and the picture is never sent anywhere: the model comes to it.
Depth inside the outline is measured with a two-pass chamfer distance transform, and the height at each point is a circular cross-section of that distance rather than the distance itself. Using the raw distance would give a tent — flat-sided, with a ridge down the middle — which reads as a folded card. The frame counts as outside whatever the picture says, so a subject cropped by the edge ends at the edge rather than standing a full bulge high against a straight wall with nothing to close it.
The relief on the surface comes, by default, from a depth estimate rather than from brightness. Brightness is not depth — a dark object in bright light and a bright object in shade come out the wrong way round, and a shadow becomes a valley — so a monocular depth model reads the picture as a scene and says which parts are nearer. It is Depth Anything V2 in its small size, running on ONNX Runtime in this tab; the model and the runtime are fetched once and kept by your browser. What it returns is relative depth over the front of the subject, which is exactly what a surface can carry and none of what the back would need.
Every control, and when to reach for it
Twelve controls, and most pictures need two of them: the shape, and how thick you want the result. The defaults cut the subject out, inflate it to 100 mm across and 30 mm through, and hand a quarter of the bulge to the picture's own shading.
| Control | What it does | Reach for it when |
|---|---|---|
| Cut the subject out | Runs a subject-segmentation model in this tab and makes everything but the subject transparent, which is where an inflated body's outline comes from. | On for a photograph, which is what it is for. Off when the whole frame is the subject — a texture, a pattern, a picture you want as a pillow rather than as the thing in it. Disabled and unnecessary for a picture that already has a transparent background, which is its own outline. |
| Height from | Chooses where a height is read from — a depth estimate made in this tab, brightness, transparency, or one of red, green and blue on their own. | Estimated depth for a photograph of a thing, which is what it is for. Brightness for a greyscale depth map you already have, or when the estimator cannot run. Transparency for a logo or a cut-out. A single channel when a render pipeline packed depth into one. |
| Invert | Reads dark as high instead of low. | Lithophanes, where thick material blocks light and the print has to be the negative. Also depth maps written near-is-black, which is the opposite convention to the usual one. |
| Smoothing | Runs that many blur passes over the heights before anything is built. | Raise it on a JPEG, where compression noise turns into visible pimples across a flat area. Drop it to zero on a clean render or a hard-edged logo, where every pass rounds a corner you wanted sharp. |
| Resolution | Samples along the picture's longest edge. The triangle count grows with the square of this number. | Raise it for fine detail — text, engraving, a face. Lower it when the count beside the button is larger than the thing you are going to do with it. A printer that lays 0.2 mm lines cannot show detail finer than 0.2 mm however many triangles you send it. |
| Shape | Inflates the outline into a solid body, or lays the heightfield flat on a plate, or wraps it around a cylinder. | A body for an object you want as an object. A plate for plaques, signs, coins and lithophanes. A cylinder for lamp shades and lithophane tubes, where light comes from inside and the picture is meant to be walked around. |
| Width | How wide the plate is in millimetres. On a cylinder it is the distance around the tube rather than across it. Height follows the picture's proportions either way. | Set it to the real size of the thing you are making, and everything else follows. On a cylinder, measuring the circumference is what keeps the picture from being stretched by π. |
| Relief depth | On an inflated body, the full thickness through its thickest point — half in front, half behind. On the other two, millimetres between the lowest point of the relief and the highest. | For a body, set it to how deep the real thing is and the proportions come out right. For a plaque, small enough to read and large enough to feel. Lithophanes live in a narrow band — typically well under a couple of millimetres between thinnest and thickest — because it is the material thickness that darkens the light. |
| Solid backing | Adds a flat back behind the relief and walls joining the two, which is what makes the mesh watertight. | On for anything that will be printed, and for anything a boolean operation or a physics engine has to reason about. Off when you want the surface alone — a displaced sheet to drop into a renderer, or geometry you are going to thicken yourself. |
| Backing thickness | Millimetres of material behind the lowest point of the relief. | Thick enough not to warp, thin enough not to waste filament. For a lithophane it is the minimum thickness the light passes through, and it is the single control that sets how bright the brightest part of the picture will be. |
| Surface detail | How much of an inflated body's bulge is handed over to the picture's own shading, from none to all of it. | Raise it when the picture's light and shade is telling you about the object's form — folds, panels, a face. Drop it to nothing for a flat-coloured logo or an icon, where the shading is a fill rather than information and modulating by it only makes the body lumpy. |
| Download as | Which of the four files is written. | See the next section — the difference between them is what they can carry, not what they cost. |
Three controls disable themselves and each says why. Surface detail belongs to the inflated body alone — a plate and a cylinder are relief all the way through, so there is no bulge to hand a share of. Backing thickness is the reverse: an inflated body has no flat back, and on the other two shapes it needs the solid backing switched on, because an open surface has no back for a thickness to describe. The cut-out disables itself for a picture that already carries transparency, since it would only rediscover an outline the file states outright.
One thing to know about the cylinder. The picture's left and right edges meet on the far side of the tube, and unless the picture happens to tile, they will not match. The mesh is closed there — it is one surface, not two with a crack between them — but the seam is visible as a step in the relief, exactly as it would be if you wrapped a photograph around a jar.
Which file to download
All four hold the same mesh. They differ in what they can carry alongside it.
| Format | Carries | Use it for |
|---|---|---|
| GLB | Geometry, normals, texture coordinates and the picture itself, in one binary file. | Almost everything. Blender, Godot, Unity, three.js, macOS Preview and Windows 3D Viewer all open it, and the picture is inside the file rather than beside it. |
| OBJ + MTL (zip) | Geometry, normals and texture coordinates as text, plus a material file and the picture. Downloads as a ZIP because the three only mean anything together. | Older pipelines, and anything where you want to read the file. Unzip all three into the same folder before importing, or the material is lost. |
| STL | Triangles. Nothing else — no colour, no texture coordinates, not even shared vertices. | 3D printing. Every slicer reads it, and it is the only one of the four that no slicer will argue with. |
| PLY | Geometry, normals, and a colour on every vertex. | MeshLab, CloudCompare, and Blender when you want colour without carrying a texture file. The colour is per vertex, so it is only as detailed as the resolution. |
One thing about units
STL, OBJ and PLY are all unitless by specification, and every tool that opens them assumes millimetres. glTF is not unitless: its unit is the metre, and there is no field to say otherwise. So a 100 mm plate is written as 100 in three of these files and as 0.1 in the GLB. That is correct in all four, and it will look wrong in Blender the first time — scale the GLB up by a thousand if you want it to measure in millimetres there, or use STL or OBJ and skip the question.
Printing one, and lithophanes
For a plaque or a sign, switch the solid backing on, give it enough thickness not to warp, and print it face up with no supports. The relief is a heightfield, so every point on it is reachable from directly above — that is the property that makes this shape print cleanly when an arbitrary mesh would not.
A lithophane is the same object read by transmitted light rather than reflected light. Thick material passes less light, so the print has to be the negative of the picture: switch Invert on, and set the backing thickness to the thinnest the light should ever pass through. The relief depth then sets how dark the darkest part gets. The numbers that work depend on your filament and your printer far more than on anything here, so print a small test strip before committing to a large one.
Print a lithophane standing up rather than lying down, at a fine layer height, with no infill worth speaking of and enough walls to be solid. Lying flat, the layer lines run across the picture and the light shows every one of them.
Opening it in Blender
File → Import, and pick the format you downloaded. GLB needs nothing else; OBJ needs its three files unzipped into one folder first, so the material can find the picture beside it.
A GLB arrives small, because glTF measures in metres — press S, type 1000, and press Enter if you would rather work in millimetres. An STL, OBJ or PLY arrives with one Blender unit standing in for one millimetre, which is usually what you wanted.
The mesh comes in shaded smooth across the relief and flat across the walls, which is what the normals in the file say. If you would rather have it all faceted, Object → Shade Flat; if a smoothed model still looks blocky, the resolution was too low, and no amount of shading will put detail back that was never sampled.
From there it is an ordinary mesh. Decimate it if the triangle count is inconvenient, add a Solidify modifier if you exported the open surface, or boolean it into something else — the solid export is watertight and manifold, which is exactly what a boolean needs to behave.
What it cannot do
It cannot see the back. An inflated body is the shape an outline implies, mirrored — so a mouse comes out as a rounded mouse-shaped body rather than as a mouse with a scroll wheel and a cable port. Anything hidden behind something else in the picture is not in the model and cannot be recovered from it. If you need the real thing, that is photogrammetry or a scanner, not one photograph.
It reads a picture, not a scene. Brightness is not depth: a dark object in bright light and a bright object in shade come out the wrong way round, and a shadow becomes a valley. That is why the depth-map sources exist — if your renderer or your camera can give you an actual depth pass, use it and the results stop being a guess.
There is a ceiling on the mesh. Past roughly a million triangles the tab is doing more work than a browser should be asked to do in one go, so the tool refuses and says by how much rather than freezing. Lower the resolution, or switch the solid backing off, and the count halves.
A feature narrower than one sample pinches. The outline is carried on the same grid the mesh is built on, so a whisker, a wire or a thin handle can end up with no interior at all — and where that happens the front and back halves touch, leaving a zero-thickness membrane rather than a solid. The model is still sealed, so a slicer will still slice it, but the edge down the middle of that membrane belongs to four faces instead of two. Raising the resolution is the fix, and it is usually a large one.
Where the work happens
Your picture is decoded, sampled, meshed and written to a file in this tab. Nothing is uploaded, no model is called, and no request carries any of it anywhere — you can watch the network panel stay empty, or turn the network off entirely and use the tool exactly as it is.
Three things can reach the network and none of them carries your picture. The cut-out model and the depth model are each fetched once from a CDN and cached by your browser — the size is on the control that uses each — and both then run on your own machine. The third is the field that fetches a picture by its address, which is the same field the other image tools carry; that request happens on the server, because a browser cannot fetch a cross-origin picture into a canvas without tainting it. Everything else is local.
