SWAPQR← Ratgeber

Gedithterte QR-Codes: Wie ein Foto zu einem scannbaren Code wird

Die meisten "künstlerischen" QR-Codes sind ein Bild mit einem Code obendrauf. Ein gedithterter QR-Code ist etwas anderes: Es gibt nur ein Bild, und der Code ist Teil seines Korns. Dieser Artikel erklärt, was ein Code tatsächlich braucht, wie Fehlerdiffusions-Dithering funktioniert, die eine Änderung, die beide sich ein Quadrat teilen lässt, die zwei Einstellungen, die das Ergebnis bestimmen, und die drei Arten, wie es scheitert.

QR-Code im Browser erstellen →Das Quadrat einmal drucken. Später entscheiden, wohin es führt.

Beginnen Sie mit dem, was ein QR-Code tatsächlich braucht

Ein QR-Code ist ein Raster aus Modulen — kleinen Quadraten, die entweder dunkel oder hell sind. Einige davon sind strukturell und können sich nicht bewegen: die drei großen Quadrate in den Ecken, mit denen ein Scanner den Code findet und ausrichtet, die dünne alternierende Linie zwischen ihnen, die kleinen Ausrichtungsquadrate und die Streifen, die Format und Version kodieren. Alles andere sind Daten plus Fehlerkorrekturbytes. Diese Fehlerkorrektur ist die Öffnung. Auf der höchsten Stufe können etwa 30 % des Codes zerstört werden, und ein Leser stellt die Nutzlast trotzdem wieder her. Ein Code muss also nicht perfekt sein. Er muss dort perfekt sein, wo es zählt, und überall sonst nah genug dran. Halten Sie an dieser Unterscheidung fest, denn die ganze Technik beruht auf ihr: Die strukturellen Module werden als unantastbar behandelt, und der Datenbereich wird als etwas behandelt, das nur im Durchschnitt stimmen muss, in dem Maßstab, in dem eine Kamera ihn sieht. Jeder Generator, der ein Bild in einen Code setzt, gibt etwas von diesem 30-%-Budget aus; die Frage ist nur, wie sorgfältig er es ausgibt und ob das Auge den Preis sehen kann.

Dithering, in einem Absatz

Floyd–Steinberg-Dithering verwandelt ein Graustufenfoto in reines Schwarz-Weiß. Man geht die Pixel der Reihe nach durch. Für jedes wählt man das nähere von Schwarz und Weiß, nimmt dann den Fehler, den man gerade gemacht hat — die Differenz zwischen dem gewünschten Grau und dem gesetzten Wert — und schiebt ihn in die noch nicht besuchten Nachbarn, gewichtet mit 7/16 auf das Pixel rechts und 3/16, 5/16 und 1/16 auf die drei Pixel darunter. Jeder dieser Nachbarn beginnt dann mit einem leicht angepassten Wert, wenn er selbst an der Reihe ist, sodass der Fehler nie verloren geht, sondern nur verschoben wird. Das Bild kommt als Feld aus Sprenkeln heraus, dessen lokale Dichte der ursprünglichen Helligkeit entspricht: Ein mittelgrauer Bereich wird zu etwa halb schwarzen Punkten, eine helle Stelle zu spärlichen Punkten auf Weiß, ein Schatten zu spärlichen weißen Punkten auf Schwarz. Aus der Entfernung mittelt das Auge die Sprenkel wieder zu Tonwerten, weshalb ein gedithtertes Bild als Foto lesbar ist, obwohl jedes Pixel darin eine von nur zwei Farben hat. Diese Mittelung ist dasselbe, was eine Kamera tut, wenn sie auf einen kleinen Druck schaut, und genau das nutzt die Technik aus.

Der Trick

Rendern Sie den Code mit einer festen Anzahl Pixel pro Modul — SWAPQR verwendet neun, sodass jedes Modul ein 9×9-Block ist. Dann dithern Sie das Foto über das ganze Quadrat, mit einer Änderung: Wo der Code einen bestimmten Wert verlangt, wird nicht per Schwellenwert entschieden. Zwingen Sie das Pixel auf das, was der Code braucht, messen Sie den Fehler, den dieses Erzwingen verursacht hat, und verteilen Sie ihn genau wie jeden anderen Fehler. Dieser letzte Satz ist die ganze Idee. Die erzwungenen Punkte werden nicht über das Bild gemalt; sie werden von den Pixeln um sie herum bezahlt, die sich zum Ausgleich verschieben. Sie landen in derselben Salz-und-Pfeffer-Textur wie alles andere, sodass das Auge nichts hat, um sie davon zu trennen. Strukturelle Module — Finder, Timing, Ausrichtung, Format — werden massiv und unberührt gezeichnet, weil ein Scanner den Code finden muss, bevor die Fehlerkorrektur ihm helfen kann. Die hier beschriebene Technik folgt dem Ansatz, den Andrew T. veröffentlicht hat, der die Erzeugung gedithterter QR-Codes 2026 beschrieb; SWAPQRs Implementierung wurde nach der Beschreibung geschrieben und nicht aus seinem Quellcode portiert.

Zwei Regler, die alles entscheiden

Der erste ist, wie viel von jedem Modul erzwungen wird. Erzwingen Sie nur das Mittelpixel, und das Bild bleibt fast unberührt, aber der Code ist zerbrechlich: Ein Pixel pro Modul muss jeden Resampling-Schritt zwischen Drucker und Kamerasensor überleben. Erzwingen Sie einen 7×7-Block aus den 9×9, und der Code ist robust und das Bild blass, weil der Großteil jedes Moduls nun massiv ist. SWAPQR legt das direkt als Foto ↔ Code-Balance offen, mit den Positionen Foto, Mitte und Code, sodass der Kompromiss eine Entscheidung ist, die Sie treffen, und keine im Generator versteckte Konstante. Der zweite ist, wie weit jedes Modul geschoben wird. Vor dem Dithering wird jedes Pixel eines dunklen Moduls ein wenig abgedunkelt und jedes Pixel eines hellen Moduls ein wenig aufgehellt. Das Bild behält sein Detail, aber der Durchschnittston des Moduls neigt in die richtige Richtung — was eine Kamera sieht, wenn sie quer durch einen Raum auf einen kleinen gedruckten Code schaut. Zusammen entscheiden die beiden Einstellungen, ob das Ergebnis ein Foto mit einem blassen Code darin ist oder ein Code mit einem blassen Foto darin, und wo auf dieser Linie ein bestimmter Druck sitzen sollte, hängt davon ab, wie er gescannt wird.

Wo es scheitert, und ob es sich lohnt

Drei Fehlerarten, alle real, keine davon geheimnisvoll. Ein flaches Foto: Ein gleichmäßig beleuchtetes, eintöniges Bild dithert zu einem regelmäßigen Schachbrett, und das ist genau die Textur, die mit dem Code konkurriert; Bilder brauchen daher einen echten Hell-Dunkel-Umfang, und das Studio warnt, wenn eines ihn nicht hat. Ein langer Link: Mehr Zeichen bedeuten mehr Module im selben Quadrat, sodass jedes Modul weniger Bild bekommt; ab etwa Version 8 — 49×49 Module — hat das Foto keinen Platz mehr zum Leben, und ein kurzer Weiterleitungslink ist die Lösung. Und extreme Nahaufnahme bei manchen Lesern, was so kontraintuitiv ist, dass es in diesem Ratgeber einen eigenen Artikel hat. Ein künstlerischer Code ist immer ein Kompromiss gegen die Zuverlässigkeit. Er verdient seinen Platz dort, wo der Code Teil des Designs ist und jemand ihn absichtlich scannen wird — ein Plakat, eine Albumhülle, eine Verpackung, eine Visitenkarte. Auf ein Fluchtwegschild gehört er nicht. Welche Einstellung auch immer: Testen Sie das gedruckte Stück mit einem echten Telefon, bevor Sie tausend davon bestellen; das Studio sagt neben dem Export-Button dasselbe, und es meint es ernst.

Teil des CodesBehandlung in einem gedithterten CodeWarum
Findermuster (drei Eckquadrate)Massiv gezeichnet, nie gedithertDer Scanner muss den Code vor allem anderen finden und ausrichten
Timing-Linie, Ausrichtungsquadrate, Format- und VersionsstreifenMassiv gezeichnet, nie gedithertStrukturell; Fehlerkorrektur kann einen Code nicht reparieren, der nicht gefunden wird
Daten- und FehlerkorrekturmoduleEin zentraler Block jedes Moduls erzwungen, der Rest trägt das FotoDer Durchschnittston des Moduls ist, was eine Kamera aus Scan-Entfernung sieht
Pixel um einen erzwungenen BlockDurch Fehlerdiffusion zum Ausgleich verschobenHält den lokalen Durchschnitt korrekt, damit die erzwungenen Punkte in den Sprenkeln verschwinden
RuhezoneHell, unberührtScanner nutzen den leeren Rand, um die Kante des Codes zu finden

Häufig gestellte Fragen

Wird das Foto einfach hinter den Code gelegt?

Nein. Code und Foto entstehen in einem Durchgang: Das Bild wird gedithert, und wo der Code einen Wert braucht, wird das Pixel erzwungen und sein Fehler in die Nachbarn verteilt. Es gibt ein einziges Bild, keine Ebene über einer anderen.

Warum neun Pixel pro Modul?

Das gibt jedem Modul einen 9×9-Block, groß genug, um einen erzwungenen Kern variabler Größe aufzunehmen und trotzdem Pixel für das Bild zu lassen. Die Balance-Einstellung entscheidet, wie viel dieses Blocks erzwungen wird.

Lässt er sich mit gewöhnlichen Telefonen scannen?

Ja, für die Nutzlasten und Bilder, für die er ausgelegt ist, und jeder Build wird gegen zwei unabhängige Decoder bei sieben simulierten Kameraentfernungen geprüft. Es bleibt ein Kompromiss gegen die Zuverlässigkeit, also drucken Sie einen und testen Sie ihn mit Ihrem eigenen Telefon.

Warum ruiniert ein langer Link das Bild?

Längerer Text bedeutet eine höhere Version, also mehr und kleinere Module im selben Quadrat. Jedes Modul hat weniger Platz für Fotopixel, und ab etwa 49×49 Modulen verschwindet das Bild. Verwenden Sie einen kurzen Weiterleitungslink.

Das Quadrat einmal drucken. Später entscheiden, wohin es führt. SWAPQR erstellt statische QR-Codes kostenlos, mit allen Stiloptionen, ohne Konto und ohne Wasserzeichen. Ein bezahlter Plan macht einen Code dynamisch: Das gedruckte Quadrat bleibt gleich, während Sie sein Ziel ändern, und Sie sehen, wie oft es gescannt wurde, nach Tag und nach Gerät.

QR-Code im Browser erstellen
Sprache: TR EN DE ES FR IT PT AR RU JA KO