Error diffusion · 1-bit · in the browser

facecard.ink

My cards →

A QR code is mostly slack — redundant pixels the scanner never misses. This puts a picture in that slack: every module is blown up, its centre held to the true value, and the rest dithered into the image around it. After Andrew Tomlinson’s original.

100%
rendering
Version
Modules
Mask
Output
Render

!Scroll to zoom, drag to pan. Keep the quiet margin when you use the code — scanners need it. The picture lives in the QR’s redundant pixels, so some phones will struggle. Always test before printing at scale.

Before you go

Own your QR code

The code you just saved points straight at your link. We are not routing it through our website first, the way most QR generators quietly do — so nobody can switch off your code, meter it, or start charging you for it later. It is yours.

The trade-off: a code that points straight at something can never be changed. If you want scan counts, or the ability to repoint the same printed code at a different link, that needs a redirect in the middle. We run one, and you can switch it on right here.

  • + Scan counts, locations and timing
  • + Repoint a printed code whenever you like
  • You no longer own the code outright — it depends on us staying up

Neither one is the right answer. Print it plain if the link will never move; track it if you would rather be able to change your mind.

Add tracking

What a scanner reads back.

1–40. Bigger holds more text. Version 6 is the largest without alignment blocks cluttering the middle.

Higher levels tolerate more of the picture.

Lifts the blacks. Helps when the image has large dark regions that swallow the code.

Drops the whites. Helps when large light regions wash the code out.

Each colour counts as light or dark. A module can only be drawn in a colour of its own polarity, so the code keeps its contrast while the picture keeps its hue.

Each module becomes N² pixels. The centre carries the data; the rest carry the picture.

Releases the worst-fitting data pixels back to the picture. Past a point the code stops scanning.