SWAPQR← Ratgeber

Warum ein künstlerischer QR-Code scheitern kann, wenn Sie ihn zu nah scannen

Jeder erwartet, dass ein QR-Code scheitert, weil er zu klein, zu weit weg, zu dunkel ist. Foto-QR-Codes haben auch den umgekehrten Fehler: Sie können aus der Entfernung perfekt lesbar sein und scheitern, wenn Sie das Telefon direkt an sie heranführen. Hier ist der Grund, mit den Zahlen aus der Messung, die ihn gefunden hat.

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

Wie ein Scanner entscheidet, was dunkel ist

Bevor ein Leser nach Modulen suchen kann, muss er ein Foto in Schwarz-Weiß verwandeln. Ein globaler Schwellenwert überlebt echtes Licht nicht — ein Schatten über einer Ecke würde den halben Code schwärzen — deshalb binarisieren die meisten Decoder lokal. ZXing, die Open-Source-Bibliothek, von der ein Großteil des Barcode-Scannens noch abstammt, teilt das Bild in 8×8-Pixel-Blöcke, berechnet den Durchschnitt jedes Blocks, glättet ihn gegen die Nachbarblöcke und verwendet das als Schwellenwert für diese 64 Pixel. Ein Pixel, das dunkler als der Schwellenwert seines Blocks ist, ist dunkel; der Rest ist hell. Für einen normalen QR-Code ist das nahezu kostenlos. Welche Blockgröße auch immer, ein Modul ist massiv, sodass der Durchschnitt eines Blocks entweder nahe dunkel oder nahe hell ist, oder zwischen beiden liegt, wenn der Block eine Grenze überspannt, und die Entscheidung ist so oder so leicht. Das Schema ist robust, billig und wurde weithin kopiert, und genau deshalb ist es wichtig: Der Decoder, dem Ihr gedruckter Code im Feld begegnet, kann gut einer sein, der auf diese Weise binarisiert.

Was sich ändert, wenn die Module aus Dither bestehen

In einem gedithterten Code ist ein Modul nicht massiv. Es ist ein kleiner erzwungener Kern, umgeben von Pixeln, die das Foto tragen. Sein Durchschnitt ist korrekt; seine Textur ist nicht gleichförmig. Betrachten Sie nun die Scan-Entfernung in der einzigen Einheit, die zählt: Kamerapixel pro Modul. Halten Sie das Telefon weit genug weg, dass ein Modul auf 5–8 Pixeln landet, und ein 8×8-Block überspannt Modulgrenzen. Der lokale Durchschnitt ist ungefähr "dieses Modul und seine Nachbarn", der Schwellenwert liegt zwischen dunkel und hell, und der Code wird gelesen. Bringen Sie das Telefon näher, sodass ein Modul 20 Pixel abdeckt, und ein 8×8-Block passt nun vollständig in ein einzelnes Modul. Der Durchschnitt des Blocks ist die eigene lokale Textur dieses Moduls. Der Schwellenwert folgt dem Dither statt dem Modul — und der Decoder rekonstruiert die Sprenkel, nicht den Code. Am Druck hat sich nichts geändert; nur die Zahl der Sensorpixel, die jedes Modul abdeckt, und mit ihr das Verhältnis zwischen dem Block des Decoders und dem Modul. Deshalb ist der Fehler eine Eigenschaft der Entfernung und nicht der Größe oder der Beleuchtung.

Die Zahl

Wir haben es beim Bau von SWAPQRs Fotomodus gemessen: drei Nutzlastlängen, sechs Bildtypen, beide Farbpolaritäten, drei Balance-Einstellungen, sieben simulierte Scan-Entfernungen, dekodiert von zwei unabhängigen Bibliotheken. Die Grenze ist sauber. Mit etwa 20 % jedes Moduls erzwungen — der fotolastigen Einstellung — und mit etwa 44 % erzwungen lasen sich die Codes bei 5–8 Pixeln pro Modul, und Leser der ZXing-Klasse wurden in der Nahaufnahme, bei 10–28 Pixeln pro Modul, unzuverlässig. Ab etwa 60 % erzwungen und darüber lasen sie sich in jeder Entfernung. Sobald mehr als etwa die Hälfte der Modulfläche massiv erzwungen ist, landet jeder 8×8-Block, der in das Modul fällt, überwiegend auf massiven Pixeln, und der Effekt verschwindet. Darunter verschwindet er nicht — und keine Feinabstimmung der Tonverschiebung behebt das, weil ein lokaler Schwellenwert den lokalen Durchschnitt ohnehin abzieht. Zu welchem Ton Sie ein Modul auch neigen, ein vollständig darin liegender Block misst diese Neigung als seine Grundlinie und filtert sie per Schwellenwert weg. Der einzige Hebel, der funktioniert, ist der Anteil des Moduls, der massiv ist, und deshalb gibt es den Balance-Regler.

Neuere Decoder, und warum das nicht das Ende ist

Neuere Decoder sind darin besser. Im selben Durchlauf las jsQR — das eine andere Binarisierungsstrategie verwendet — jede Konfiguration in jeder Entfernung, und die in aktuelle Telefone eingebauten Scanner sind noch stärker. Aber "die meisten Telefone schaffen es" ist nicht dasselbe wie "jeder Leser schafft es", und ein gedruckter Code trifft auf den Leser, der zufällig auf ihn gerichtet wird: ein älteres Telefon, ein Kassenscanner, ein Kiosk, eine App, die eine von ZXing abgeleitete Bibliothek bündelt. Die fotolastige Balance ist deshalb ehrlich über ihren Kompromiss — das Studio weist darauf hin, dass moderne Telefonscanner sie in jeder Entfernung lesen, während ältere, einfachere Leser bei extremer Nahaufnahme Schwierigkeiten haben können — und die Entscheidung, wo auf der Balance man sitzt, hängt davon ab, wer den Code scannen wird und aus welcher Entfernung. Sie hängt auch davon ab, wo ein Telefon natürlicherweise landet: Niemand hält ein Telefon auf Armlänge von einem Plakat, aber jeder führt es direkt an eine Visitenkarte, und das ist der Fall, in dem ein fotolastiger Code und ein einfacherer Leser aufeinandertreffen können.

Was dagegen zu tun ist

Wenn der Code irgendwohin kommt, wo Menschen aus normaler Entfernung scannen — ein Plakat, ein Tischaufsteller, ein Regaletikett — sind die fotolastigen Einstellungen in Ordnung; in dieser Entfernung deckt ein Modul eine Handvoll Kamerapixel ab und die Blöcke überspannen Grenzen, wie sie sollen. Wenn er irgendwohin kommt, wo Menschen ein Telefon direkt daran halten — ein kleiner Aufkleber, eine Visitenkarte, ein Bildschirm — verschieben Sie die Balance Richtung Code, sodass mehr als die Hälfte jedes Moduls massiv ist und der Nahaufnahme-Effekt für jede Klasse von Lesern verschwindet. So oder so: Drucken Sie einen und scannen Sie ihn mit einem Telefon. Kein Screenshot auf einem Monitor: das tatsächlich gedruckte Stück, in der tatsächlichen Größe, aus der Entfernung, die Menschen tatsächlich nutzen werden, und idealerweise mit mehr als einem Telefon. SWAPQR zeigt diese Warnung im Studio selbst und nicht im Kleingedruckten, weil ein Code, der im Feld scheitert, schlimmer ist als ein schlichter Code, der funktioniert, und weil die Lösung ein Schieberegler statt eines Nachdrucks ist, wenn Sie es vor der Auflage bemerken.

Erzwungener Anteil jedes ModulsFern / normal (5–8 px pro Modul)Nahaufnahme (10–28 px pro Modul)
~20 % (fotolastig)LiestLeser der ZXing-Klasse unzuverlässig
~44 % (Mitte)LiestLeser der ZXing-Klasse unzuverlässig
~60 % und darüber (codelastig)LiestLiest
Jede Einstellung, jsQR-Klasse und aktuelle TelefonscannerLiestLiest im selben Durchlauf

Häufig gestellte Fragen

Mein Telefon liest den Foto-Code aus jeder Entfernung. Warum die Warnung?

Aktuelle Telefonscanner verwenden eine stärkere Binarisierung und lasen jede Konfiguration in unserem Durchlauf. Die Warnung betrifft ältere oder einfachere Leser, die in 8×8-Blöcken binarisieren und denen ein gedruckter Code noch begegnen kann.

Warum behebt es das Problem, das Telefon weiter wegzuhalten?

Weiter weg deckt jedes Modul weniger Kamerapixel ab, sodass der 8×8-Block eines Decoders mehrere Module überspannt und sein Durchschnitt zwischen dunkel und hell liegt. Aus der Nähe fällt ein Block in ein einzelnes Modul und folgt stattdessen der Dither-Textur.

Hilft es in der Nahaufnahme, die Tonverschiebung zu erhöhen?

Nein. Ein lokaler Schwellenwert zieht den lokalen Durchschnitt ab, sodass jede gleichförmige Neigung innerhalb eines Moduls weggefiltert wird. Nur der Anteil des Moduls, der massiv erzwungen ist, ändert das Ergebnis.

Welche Balance ist für eine Visitenkarte sicher?

Verschieben Sie sie Richtung Code, sodass mehr als etwa die Hälfte jedes Moduls massiv ist. An diesem Punkt lesen Leser der ZXing-Klasse in unserer Messung in jeder Entfernung, und das Bild ist noch sichtbar, nur blasser.

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