All studies

Multiscale curved strokes

Painterly rendering

Repaint a photograph with curved strokes, starting with broad shapes and returning for smaller details.

JavaScript · Canvas · Web Workers · Multiscale curved strokes

View source on GitHub

Try it

Runs locally in your browser. Uploaded images stay on your device.

All processing stays in your browser. Image uploads are resized to a 384px preview.

Run a painting, then replay its strokes in the order they were laid down.

Source image
Source image
Precomputed Painterly rendering example
Computed example · run to make your own

Ready when you are.

Worker processing · local inputs · downloadable output

How it works

Run a painting, then replay its strokes in the order they were laid down.

  1. Blur the reference at each brush scale.
  2. Find areas where the canvas differs from the reference, and seed strokes there.
  3. Follow image-gradient tangents to bend strokes along forms; refine with smaller brushes.

Read the original research
Aaron Hertzmann · 1998

Computed examples

Outputs from the same implementation used in the playground.

Original harbor photograph used by the algorithm
Harbor photograph · generated input
A harbor photograph repainted with broad and fine curved brush strokes
Curved strokes · coarse-to-fine painting

Source photographs were generated for these studies. The displayed results were computed by the algorithms; they are not generated illustrations of an expected result. Published previews are compressed for the web.

Implementation and limits

A multiscale curved-stroke study with a software rasterizer. It does not simulate wet paint, pigment, or a physical bristle brush.

Interactive settings are bounded to keep the experiment practical in a browser. Higher detail can cost more processing time without guaranteeing a better result. The implementation and its tests are available in the source repository.

The result records each stroke’s curved path, radius, color, and order. Replay rebuilds that painting from the stored strokes.