Image to V-Carve G-Code Generator

Photo V-carving cuts a picture as rows of V-bit grooves: darker parts of the image are cut deeper, so the groove is wider (w = 2·d·tan(θ/2)) and the board looks darker there. Load an image, choose your bit and line spacing, check the simulated carving and download G-code for GRBL routers. Your image never leaves your computer. Published November 1, 2026.

Image and size

Showing a built-in demo image until you choose one.

V-bit and depth

Tone

Machine

Z0 is the top of the stock. RPM 0 sends a plain M3 (for a router switched by hand). Starting feeds: see the CNC router feeds & speeds calculator.

Simulated Carving

Each groove is drawn at its true width at the top of the cut. Real carvings also show light and shadow inside the V, so they look a little softer than this.

G-Code

-

The box shows the first 60 lines; the download has the full program. Check the toolpath in the G-code viewer before cutting, and air-cut the first lines above the stock.

How Photo V-Carving Works

A V-bit cuts a groove whose width grows with depth. Run the bit along evenly spaced lines, go deeper where the picture is dark and shallower where it is light, and the rows of grooves form a halftone image, much like the lines of an old engraving.

This generator reads the image along each line, turns brightness into a depth between your min and max depth, and writes straight G1 moves that change Z as they go. Points on the same straight 3D line are merged, so flat or evenly sloping stretches become one move and the file stays small without changing the path.

The Formulas

1. Groove width
w = 2 × d × tan(θ ÷ 2)
d is depth below the surface, θ the included angle of the bit. A 90° bit cuts a groove twice as wide as it is deep; a 60° bit about 1.15 times; a 30° bit about 0.54 times. This assumes a sharp point; bits with a flat tip cut a little wider.
2. Max depth from line spacing
d_max = spacing ÷ (2 × tan(θ ÷ 2))
At this depth the darkest grooves just touch their neighbours. Deeper than this and black areas merge into one flat hollow and lose detail, so many people stay at or a little under d_max.
3. Brightness to depth
L' = (L − 0.5) × (100 + c) ÷ (100 − c) + 0.5 + b ÷ 100
dark = 1 − L'^(1 ÷ γ)   (invert: dark = L'^(1 ÷ γ))
depth = min + dark × (max − min)
L is pixel lightness from 0 (black) to 1 (white), c contrast, b brightness, γ gamma. L' is held between 0 and 1. Gamma above 1 lightens the mid tones (shallower cuts); below 1 darkens them.
4. Run time estimate
t = cut length ÷ feed + plunges ÷ plunge rate + rapids ÷ rapid rate
Real jobs usually take longer, because a controller slows down for the many short moves in a photo. Treat it as a lower bound.

Worked Example

60° V-bit, 1.0 mm line spacing, picture 150 × 100 mm, horizontal zig-zag lines, 0.3 mm sample step
  • tan(60° ÷ 2) = tan 30° = 0.5774, so d_max = 1.0 ÷ (2 × 0.5774) = 1.0 ÷ 1.1547 = 0.866 mm.
  • Check: at 0.866 mm the groove is 2 × 0.866 × 0.5774 = 1.00 mm wide, the same as the spacing.
  • A 50 % grey pixel (128 out of 255) with min depth 0: dark = 1 − 128 ÷ 255 = 0.498, depth = 0.498 × 0.866 = 0.431 mm, groove = 2 × 0.431 × 0.5774 = 0.50 mm, so half the surface is cut away and it reads as mid grey.
  • Lines: the first is 0.5 mm up, then every 1.0 mm, giving 100 lines. Each has 150 ÷ 0.3 + 1 = 501 samples, so 50,100 points in all, well under the 400,000-point limit.
  • Time for an all-grey picture: 100 × 150 mm = 15,000 mm of cutting at 1500 mm/min = 10.0 minutes, plus about 0.6 minutes of plunges and rapids, so roughly 10.6 minutes before acceleration losses. White areas that are lifted over shorten it.

Choosing and Preparing the Image

  • Strong, simple pictures carve best. Close-up portraits, pets, and buildings against the sky work well; busy landscapes and low-contrast snapshots turn to mush at 1 mm lines.
  • Crop tight so the subject fills the frame, and remove a cluttered background if you can.
  • Boost contrast a little (10 to 30) and use gamma to recover faces that come out too dark. Check the preview after each change.
  • Size against spacing: the detail you get is about one line spacing. At 1 mm spacing a 150 mm portrait has about 150 lines across it; halve the spacing (and depth) for fine detail on a small piece.
  • Line direction: horizontal is the usual choice; diagonal lines hide wood grain that runs along the board and look less like a scan pattern.

Material, Feeds and Setup

  • Light, even hardwoods such as maple, beech or good birch plywood give contrast from the shadow in the grooves. Avoid strong grain such as oak or pine knots, which fight the picture.
  • MDF painted black, then sanded or surfaced after carving shows the light core in the grooves and gives very strong contrast. Turn on Invert if you want dark parts of the photo to stay dark on a black top: then light areas cut deepest.
  • Acrylic with paint fill: carve, flood the grooves with paint, then sand or scrape the top back. Cast acrylic machines more cleanly than extruded.
  • Feeds (rule of thumb): photo cuts are shallow, so a hobby router can run a carbide V-bit at a moderate feed, typically 1000 to 2500 mm/min at 16,000 to 20,000 rpm, plunge 300 to 600 mm/min. Small 3018-class machines usually need slower feeds, often 300 to 800 mm/min. Start low and test on scrap; the CNC router feeds & speeds calculator helps with chip load.
  • Flatness matters more than anything: grooves are only tenths of a millimetre deep, so a board that is 0.3 mm out of flat fades out on one side. Surface the spoilboard and the board first, clamp it flat, and set Z0 on the top in the middle.
  • Safety: wear eye and hearing protection, use dust extraction (MDF dust is harmful), never leave a long job running unattended, and keep your hand off the hold-down clamps' path. Do an air cut first, with Z0 set above the stock.

Related Tools and How They Differ

Frequently Asked Questions

A 60° bit is the common choice: it is deep enough to cast a shadow and wide enough to keep runs short. A 90° bit cuts half the depth for the same width, which suits slightly uneven boards. A 30° bit needs deeper cuts and is best for fine lines on small pieces.

Set the max depth so the darkest groove is about as wide as the line spacing: d_max = spacing ÷ (2 × tan(angle ÷ 2)). For a 60° bit at 1 mm spacing that is 0.866 mm. Deeper cuts make dark areas merge, and shallower ones give a lighter, lower-contrast picture.

Light, plain hardwoods such as maple or birch plywood, or MDF painted black and sanded after carving for the strongest contrast. Acrylic works with paint rubbed into the grooves. Whatever you use, surface it flat first, because small depth errors show up as faded patches.

Yes, it uses only G90, G20 or G21, G0, G1, G4, M3, M5 and M2 or M30, which GRBL and most hobby controllers accept. Z0 is the top of the stock and X0 Y0 is the lower-left corner or the centre of the image. Preview the file and do an air cut before carving.

Invert when the grooves will look lighter than the surface, such as a board painted black before carving or dark wood with a light inside. Then light parts of the photo are cut deepest. On plain light wood leave it off, because the shadow in the grooves makes them look darker.

Feeds, speeds and material notes are typical starting values and rules of thumb, not data for your machine. The preview is a simulation, and the run time is an estimate. Check the G-code in a viewer, air-cut first, and keep your hand near the stop button.