Titelbild zum Artikel „Maskenmuster im QR-Code: warum gleiche Daten anders aussehen“
Technologie

Maskenmuster im QR-Code: warum gleiche Daten anders aussehen

6 Min. Lesezeit
QR-Code erstellen

Geben Sie dieselbe URL an zwei verschiedene QR-Generatoren, bei gleicher Version und gleicher Fehlerkorrekturstufe. Die drei Eckquadrate stimmen überein, die Taktlinien dazwischen auch. Der Bereich in der Mitte, in dem die Daten sitzen, kann dagegen wie zwei völlig verschiedene Bilder aussehen. Beide Codes lassen sich lesen, und beide tragen dieselbe Zeichenkette.

Der Unterschied liegt darin, welche Maske jeder Encoder gewählt hat, und diese Wahl passiert in einem Schritt, den fast niemand sieht.

Rohdaten ergeben schlechte Bilder

Die Kodierung verwandelt Ihren Inhalt in einen Strom von Codewörtern, hängt Reed-Solomon-Korrekturcodewörter an und führt diesen Strom dann im Zickzack durch die Matrix, beginnend unten rechts. Die Platzierungsregel ist fest und mechanisch. Sie schert sich nicht darum, was die Bits zufällig sagen, und das Verhältnis von Daten- zu Korrekturcodewörtern ist zugleich das, was die Kapazität begrenzt.

Die Bits können also etwas Unglückliches sagen. Inhalt mit langen sich wiederholenden Abschnitten kann ein Feld gleichfarbiger Module ins Raster kippen. Eine andere Zeichenkette erzeugt Streifen, die über die halbe Breite des Symbols laufen. Das schlimmste Ergebnis ist, wenn die Daten zufällig das Lauflängenverhältnis nachbilden, das ein Suchmuster definiert, mitten im Code, wo kein Suchmuster hingehört.

Jedes davon zerstört einen anderen Teil des Lesevorgangs. Die Scanfolge beginnt damit, die drei Suchmuster zu finden, daraus Ausrichtung und Modulgröße abzuleiten und dann das Raster Zelle für Zelle abzutasten. Große gleichförmige Flächen lassen dem Abtastraster nichts, woran es sich selbst prüfen kann, sodass sich kleine Fehler in der Modulgrößenschätzung über das Symbol hinweg aufsummieren. Ein viertes suchmusterförmiges Objekt macht schon den allerersten Schritt mehrdeutig.

Was die Maske umdreht und was sie nie berührt

Der Encoder baut acht Kandidatenfassungen desselben Symbols. Für jede nimmt er ein festes geometrisches Muster und verknüpft es per XOR mit dem Datenbereich: Wo das Muster eins sagt, kippt das Modul die Farbe; wo es null sagt, bleibt das Modul wie kodiert.

Funktionsmuster sind ausgenommen. Suchmuster, ihre Trenner, die Taktlinien, Ausrichtungsmuster sowie die Bereiche für Format- und Versionsinformation sind alle ausgeschlossen, weshalb diese Teile bei allen Generatoren gleich aussehen.

Die acht Muster sind absichtlich unähnlich. Manche kippen nach Zeilenparität und erzeugen waagerechte Bänderung. Manche arbeiten spaltenweise und erzeugen senkrechte Bänder. Eines ist ein feines Schachbrett. Andere erzeugen Diagonalen in verschiedenen Neigungen oder gröbere Blöcke und Gitter. Die Breite ist der Punkt. Auf welche unglückliche Form die Rohdaten auch gefallen sind, mindestens eines der acht wird sie wahrscheinlich aufbrechen.

Vier Strafregeln, an jedem Kandidaten bewertet

Mit acht fertigen Kandidaten in der Hand bewertet der Encoder jeden und behält den niedrigsten. Vier Regeln speisen die Bewertung, und jede bildet eine bestimmte Art ab, wie ein Lesevorgang scheitern kann.

Die erste Regel bestraft lange Läufe einer Farbe entlang einer Zeile oder Spalte. Ein Lauf von fünf holt sich eine Grundstrafe, und jedes zusätzliche Modul in diesem Lauf legt noch etwas drauf. Das ist es, was die breiten leeren Felder verhindert.

Die zweite Regel zählt 2x2-Blöcke einer einzigen Farbe und berechnet für jeden etwas. Blöcke richten weniger Schaden an als lange Läufe, aber sie zehren an der örtlichen Kanteninformation, mit der ein Lesegerät sein Abtastraster ehrlich hält.

Die dritte Regel jagt den Suchmuster-Doppelgänger: jenes markante Verhältnis dunkel-hell-dunkel-hell-dunkel mit einer breiten hellen Fläche auf einer Seite. Sie trägt ein weit höheres Gewicht als die anderen drei, ungefähr um eine Größenordnung, was zeigt, wie die Norm die Gefahr einordnet. Ein zufälliges Pseudo-Suchmuster wiegt schwerer als ein großer Haufen verstreuter Blöcke.

Die vierte Regel misst das Gesamtverhältnis von Dunkel zu Hell über das ganze Symbol und bestraft das Abdriften von einer gleichmäßigen Aufteilung. Ein Symbol, das zu 70 Prozent dunkel herauskommt, macht es einem Bildsensor schwerer, seine Schwarz-Weiß-Schwelle zu setzen, besonders bei schwachem Licht oder auf einem kontrastarmen Druck.

Beachten Sie, was die Bewertung ignoriert: ob das Ergebnis gut aussieht. Strafpunkte drehen sich allein um Lesbarkeit, und Sieger ist schlicht der Kandidat, der am wenigsten schlecht abschnitt.

Die Maskennummer reist in der Formatinformation mit

Ein Decoder kann nicht erschließen, welche Maske angewandt wurde, also muss man es ihm sagen. Drei Bits, die die Maske benennen, sitzen in der Formatinformation neben der Fehlerkorrekturstufe. Diese Bits bekommen eine eigene Fehlerkorrektur und werden zweimal ins Symbol geschrieben, an zwei getrennten Stellen neben den Suchmustern.

Die Verdopplung ist Absicht. Geht die Formatinformation verloren, wird das gesamte Symbol unlesbar, egal wie unversehrt der Datenbereich ist, denn das Lesegerät kann nicht wissen, welches Muster zu entfernen ist. Lesen ist dieselbe Operation wie Schreiben: Wenden Sie die benannte Maske ein zweites Mal an, und die ursprünglichen Bits kommen zurück.

Warum zwei Generatoren sich uneinig sind

Der größte Teil der optischen Unterschiede zwischen Werkzeugen geht auf die Ränder dieses Vorgangs zurück. Die Strafbewertung liefert eine Zahl, und die niedrigste gewinnt, aber die Umsetzungen unterscheiden sich darin, wie sie Gleichstände behandeln und wie sorgfältig sie jeder Klausel der Bewertungsregeln folgen. Manche Encoder überspringen die Bewertung ganz und schreiben eine Maske aus Geschwindigkeitsgründen fest. Die Ausgabe dekodiert trotzdem, das ist also zulässig, verzichtet aber auf die Optimierung.

Zwei Codes von zwei Diensten können somit beide korrekt sein und einander gar nicht ähneln. Sie Modul für Modul zu vergleichen ist kein aussagekräftiger Test für einen von beiden. Beide zu scannen schon.

Corporate Design, Druckvorstufe und Tonwertzunahme

Die erste Folge betrifft das Gestaltungshandbuch. Wird derselbe Inhalt zweimal erzeugt, kann der Encoder eine andere Maske wählen, und dann sieht der Code auf der Visitenkarte anders aus als der auf dem Plakat, obwohl beide dasselbe Ziel tragen. In einem Haus mit verbindlichen Gestaltungsrichtlinien führt das zu Rückfragen aus der Markenprüfung, die niemand beantworten kann. Erzeugen Sie den Code deshalb einmal, legen Sie ihn als Vektordatei in die Bildbibliothek, notieren Sie die Zieladresse im Dateinamen und verwenden Sie diese eine Datei überall. Das ist keine Kosmetik: Ein Symbol, das überall gleich aussieht, lässt sich auch überall gleich prüfen.

Die zweite Folge betrifft den Druck. Jede Maske erzeugt eine andere Verteilung dunkler Flächen, und auf ungestrichenem Papier arbeitet die Tonwertzunahme genau gegen die schmalen hellen Zwischenräume. Ein Symbol, das auf gestrichenem Bilderdruck einwandfrei liest, kann auf Naturpapier zulaufen, und zwar zuerst dort, wo die Maske große dunkle Gruppen gelegt hat. Fragen Sie in der Druckerei nach der Tonwertzunahme für das gewählte Papier und geben Sie dem Code mehr Modulgröße, statt hinterher am Kontrast zu drehen; welche Papiere hier wie reagieren, steht im Beitrag zu QR-Codes auf verschiedenen Papieren.

Und die dritte Folge ist eine Warnung an geschickte Hände. Einzelne Module nachträglich umzufärben, weil das Muster dann ruhiger wirkt, sieht aus wie Gestaltung, ist aber Beschädigung. Der Encoder hat bereits die beste von acht Varianten gewählt; jedes von Hand gekippte Modul geht anschließend vom Fehlerkorrekturbudget ab, und zwar zusätzlich zu allem, was Papier, Licht und Winkel später noch fordern.

Was das für einen gestalteten Code bedeutet

Alles, was auf ein fertiges Symbol gelegt wird, kommt nach der Maskierung. Der Encoder hat die Modulanordnung optimiert, ohne zu wissen, dass später ein Logo darüber liegt; verdeckte Module gehen daher vom Fehlerkorrekturbudget ab, statt dass die Maske um sie herumgeführt hätte. Das ist der eigentliche Grund, ein Logo klein und in der Mitte zu halten, statt es Richtung Ecke wandern zu lassen, wo es ein Suchmuster oder dessen Trennzone anschneidet.

Farb- und Formbehandlungen wirken genauso. Abgerundete Ecken und punktförmige Module weichen genau die Kanten auf, deren Erhalt die ersten beiden Strafregeln dienen, und eine kontrastarme Palette arbeitet gegen die vierte. Codes lesen sich meist trotzdem, weil die Fehlerkorrektur Spielraum lässt, aber Sie geben Spielraum aus, den die Maske in Ihrem Namen bereits einmal ausgegeben hat. Gestaltungsentscheidungen in einem individuellen Code sind einzeln billig und dreifach gestapelt teuer. Scheitert eine gestaltete Fassung, während eine schlichte mit identischem Inhalt gelingt, hat es normalerweise dort begonnen — und es lohnt sich, den Fehler zu diagnostizieren, bevor die Datei überhaupt in die Nähe einer Auflage kommt.

Diesen Artikel teilen