Wie groß kann das Logo auf einem QR-Code sein? Wir haben es gemessen
30% Fehlerkorrektur" ist kein Logo-Budget. Wir erzeugten wachsende Löcher in Codes auf jeder EC-Stufe, bis ein echter Decoder versagte, und verzeichneten, wo es brach.
Was ist hier neu: Der größte zentrierte Patch, den ein QR-Code bei jeder Fehlerkorrektur-Ebene toleriert, gemessen durch das Stanzen eines wachsenden Lochs in ein echtes Symbol und dessen Dekodierung mit jsQR — 4 % auf L, 7 % auf M, 12 % auf Q, 17 % auf H — plus zwei Ergebnisse, die niemand veröffentlicht: Verstreute Beschädigungen unterbrechen einen Code bei 4 %, wo ein zusammenhängender Block 17 % übersteht, und derselbe Patch über einem Finder-Muster bricht ihn bei 1 %.
Jeder Leitfaden zum Hinzufügen eines Logos zu einem QR-Code sagt dasselbe zweimal: Verwenden Sie error correction level H, und denken Sie daran, dass es 30 % des Codes wiederherstellen kann. Die zweite Hälfte wird so oft wiederholt, dass sie zu einem Design-Brief geworden ist — bis zu 30 % überdecken — und das ist nicht das, was die Zahl bedeutet.
Wir haben gemessen, was sie wirklich bedeutet.
# Was „30 % Fehlerkorrektur" wirklich bedeutet
Ein QR-Code speichert Ihre Daten nicht als Pixel, von denen Sie einige verlieren können. Er speichert Codewörter: Blöcke von acht Modulen, geschützt durch Reed–Solomon-Fehlerkorrektur. Die Headline-Ziffer von Level H beschreibt grob, wie viele dieser Codewörter rekonstruiert werden können — und ein Teil dieser Kapazität wird durch den Overhead der Kodierung verbraucht, bevor Sie überhaupt etwas berühren.
Zwei Konsequenzen, die wichtiger sind als die Zahl:
- Beschädigungen werden pro Codewort, nicht pro Modul gezählt. Ein Modul zu zerstören zerstört das ganze Codewort, zu dem es gehört.
- Die Finder-Muster, Timing-Muster und Format-Informationen sind nicht durch Fehlerkorrektur abgedeckt. Sie zeigen dem Decoder, wie er das Symbol überhaupt findet, und es gibt nichts, um sie daraus zu rekonstruieren.
So ist „30 %" eine Tatsache über die Mathematik und keine Genehmigung zum Bild. Hier ist die Genehmigung.
# Das gemessene Logo-Budget pro Level
Die Methode, damit Sie es selbst nachvollziehen können: Kodieren Sie https://mqr.sh/AB12CD mit dem Encoder, den MostlyQR versendet (buildMatrix, der den MIT node-qrcode umhüllt), festgelegt auf Symbol-Version 3 (29 Module) bei jedem Fehlerkorrektionslevel, sodass EC die einzige Variable ist. Rendern Sie mit 8 Pixeln pro Modul mit der vollständigen 4-Modul-Ruhezone. Weißen Sie ein zentrales Quadrat aus, beginnend bei 1 % der Symbolfläche und wachsend um 1 % nach jedem Schritt, und übergeben Sie die Pixel jsQR 1.4.0 nach jedem Schritt. Die aufgezeichnete Zahl ist die letzte Größe, die dekodiert wurde, bevor der erste Fehler auftrat.
| Fehlerkorrektur | Größtes zentrales weißes Patch, das noch dekodiert wurde |
|---|---|
| L | 4 % der Symbolfläche |
| M | 7 % |
| Q | 12 % |
| H | 17 % |
Level H ist ungefähr viermal besser als Level L — ein echter Unterschied, und der Grund, warum jeder Leitfaden Ihnen sagt, es zu verwenden. Es ist auch nirgends in der Nähe von 30 %.
Als Faustregel aus diesen Zahlen: Bei Level H sollte ein zentrales Logo, das etwa 15 % der Codefläche einnimmt — ein Quadrat, das ungefähr 39 % der Codebreite beträgt — innerhalb der gemessenen Grenze mit etwas Spielraum liegen. Die gemessene Grenze bei Level M beträgt 7 %, was ein Quadrat von etwa 26 % der Breite ist, also verringern Sie es auf die gleiche Weise und Sie sind auf etwa ein Fünftel herunter.
Wir haben das Ganze mit 16 Pixeln pro Modul wiederholt und bekamen identische Ergebnisse, was das erwartete Ergebnis ist: Dies ist eine Eigenschaft des Symbols, nicht der Darstellung.
# Warum ein Blob billiger ist als Konfetti
Hier ist das Ergebnis, das wir nicht erwartet haben, und es ist das, das erklärt, warum zentrierte Logos überhaupt funktionieren.
Anstatt eines zusammenhängenden Patches haben wir einzelne Datenmodule nach dem Zufallsprinzip über das Symbol herum umgeschaltet — alle Finder-, Timing- und Ausrichtungsmuster intakt gelassen — und die Rate erhöht, bis die Dekodierung fehlschlug. Gleiche Nutzlast, gleiche Version, gleicher Decoder, fünf verschiedene zufällige Seeds:
| Fehlerkorrektur | Max. verteilter Schaden (Median von 5 Läufen) |
|---|---|
| L | 1 % von 567 Datenmodu len |
| M | 3 % |
| Q | 3 % |
| H | 4 % |
(Das v3-Symbol hat 841 Module, von denen 567 Daten tragen; der Rest sind Finder-, Timing-, Ausrichtungs- und Format-Muster, die dieser Test intakt gelassen hat.)
Vier Prozent verstreut, gegen siebzehn Prozent in einem Blob, auf der gleichen Ebene.
Der Grund ist das Codewort. Ein zusammenhängender Quadrat von 17 % zerstört eine kleine Anzahl von Codewörtern vollständig. Die gleiche Menge an Schaden, über das ganze Bild verstreut, zerstört ein Stück von vielen Codewörtern — und ein Codewort mit einem fehlerhaften Modul ist genauso kaputt wie ein Codewort mit acht. Fehlerkorrektur zählt Verluste, nicht Schaden.
Dies kehrt den üblichen Instinkt um. Eine einzelne saubere Form an einer Stelle ist der billigste Weg, um Ihre Fehlerkorrektur auszugeben. Sprenkelung, eine Textur, ein halbdurchsichtiges Wasserzeichen oder ein Fotofilter über den ganzen Code ist das teuerste, auch wenn es wie weniger Schaden aussieht.
# Die drei Ecken, die Sie nicht überdecken dürfen
Gleicher Test, gleiches wachsendes Quadrat, an zwei anderen Positionen bewegt:
| Patch-Position | Level H Bruchpunkt |
|---|---|
| Mitte | 17 % |
| Untere rechte Ecke (über dem Ausrichtungsmuster) | 5 % |
| Obere linke Ecke (über einem Finder-Muster) | 1 % |
Bei Level L fehlschlug der Fall der oberen linken Ecke bereits beim ersten Schritt — unter 1 %.
Diese Ecken sind Struktur, keine Inhalte. Die drei großen konzentrischen Quadrate sind die Finder-Muster, und die kleinere, die in der Nähe der unteren rechten Ecke eingefügt ist, ist ein Ausrichtungsmuster; zwischen ihnen funktioniert der Decoder, wo sich das Symbol befindet, wie groß es ist und wie es gedreht oder verzerrt ist. Überdecken Sie einen und es gibt keinen Dekodierungsschritt zu erreichen. Das Fehlerkorrektionslevel macht fast keinen Unterschied, da die Fehlerkorrektur sie niemals geschützt hat.
Dies ist der Grund, warum der sichere Platz für ein Logo die Mitte ist, und warum „machen Sie es einfach kleiner und legen Sie es in eine Ecke" genau umgekehrt ist.
# Was eine Kamera hinzufügt, das dieser Test nicht hat
Alles Obige ist ein sauberer, synthetischer, bester Fall:
- Ein Decoder. jsQR ist ein guter, weit verbreiteter Decoder, aber der Kamera-Stack eines Telefons ist nicht jsQR. Echte Leser unterscheiden sich in der Aggressivität, mit der sie einen beschädigten Code versuchen.
- Perfekte Pixel. Keine Unschärfe, kein Glanz, keine Perspektive, kein Druck. Jeder von ihnen verringert das Budget.
- Ein sauberes weißes Loch. Ein echtes Logo hat Farbe, Kanten und Antialiasing gegen die Module darunter. Die weiße Platte hinter einem Logo ist nicht Dekoration — sie ist das, was die überdeckte Fläche eindeutig macht.
Behandeln Sie die Tabelle als eine obere Grenze, die unter idealen Bedingungen gemessen wurde, nicht als Ziel zum Entwerfen. Unser eigener Rat ist, etwa zwei Drittel davon auszugeben.
# Dies selbst nachvollziehen
Jede Zahl oben wird durch ein Skript gedruckt, anstatt in den Artikel eingegeben zu werden: draft/mostlyqr/seo/benchmarks/logo.js in unserem Repository. Es rendert das Symbol bei jedem Level, wächst jeden Patch um ein Prozent nach jedem, führt den Vergleich der verteilten Schäden über fünf Seeds durch, und führt das Ganze bei einer zweiten Pixelskala erneut aus. Es sondiert auch unseren eigenen Validator für die Grenze, die am Ende dieses Stücks zitiert wird.
# Was Sie tatsächlich tun sollten
- Verwenden Sie error-correction level H, wenn es ein Logo gibt. Es vervierfacht ungefähr Ihr Budget, und es kostet etwa vier zusätzliche Module pro Seite auf einem kurzen Link — was eine Größenentscheidung ist, die Sie berechnen können, anstatt zu raten.
- Halten Sie das Logo zentriert, und halten Sie es unter etwa 15 % der Codefläche. Das ist ein Quadrat von etwa 39 % der Codebreite, bei Level H.
- Legen Sie es auf eine feste Platte, damit die überdeckte Fläche sauber statt mehrdeutig ist.
- Lassen Sie nichts die drei Eckquadrate berühren — nicht das Logo, nicht einen Rahmen, nicht eine abgerundete-Ecken-Zuschnitt.
- Testen Sie den tatsächlichen Druck mit einem schlechten Telefon. Jede Zahl hier sagt, welche Designs das Testen wert sind. Nur der Test sagt, ob es funktioniert.
Wenn Sie möchten, dass das Bild der ganze Code ist, anstatt ein Patch in seiner Mitte, das ist eine andere Technik mit einem anderen Budget — wir haben Photo-QR-Codes separat gemessen, und sie geben sich keine Fehlerkorrektur aus. Und wenn Sie einfach einen Code mit Ihrem Logo möchten, MostlyQRs Generator erzwingt das error-correction level H, sobald ein Logo hinzugefügt wird, behält die 4-Modul-Ruhezone bei, und setzt das Logo standardmäßig auf 22 % der Codebreite — 4,8 % seiner Fläche, bequem innerhalb von allem, das oben gemessen wurde.
Eine ehrliche Anmerkung zu unserem eigenen Code, da wir die Zahlen veröffentlichen: Die Garantie, die ein übergroßes Logo ablehnt, verwendet die nominale 30%-Wiederherstellungsziffer mit einem 15%-Haarschnitt, daher akzeptiert sie ein Logo, das etwa 25 % der Fläche bei Level H überdeckt. Unsere Messung sagt, dass die echte Obergrenze näher bei 17 % liegt. Die Standardeinstellung, die niemand ändert, ist sicher um einen großen Spielraum, aber die Grenze ist lockerer als die Evidenz unterstützt, und das ist ein Bug in unserem Validator, anstatt einer Subtilität von QR-Codes, und es ist auf der Fix-Liste.
Häufig gestellte Fragen
Kann ein Logo 30% eines QR-Codes abdecken?
Nein. Die „30%" in der Fehlerkorrektur-Ebene H beziehen sich auf Codeworte — Blöcke von acht Modulen, die Reed-Solomon rekonstruieren kann — und ein Teil dieses Budgets wird bereits für die Kodierung selbst aufgewendet, nicht als Reserve für Sie. In unserem Test war das größte zentrierte Quadrat, das wir in einem Level-H-Code auslöschen konnten und das immer noch dekodierbar war, 17% der Fläche des Symbols. Bei Level L waren es 4%. Behandeln Sie 30% als eine Beschreibung der Mathematik, nicht als Gestaltungsspielraum.
Welches Fehlerkorrektur-Level sollte ich für einen QR-Code mit einem Logo verwenden?
H, wenn die Größe für Sie in Ordnung ist. In unseren Messungen hat sich der tolerierbare zentrierte Bereich gegenüber Level L etwa vervierfacht (17% gegenüber 4%) auf Kosten von vier zusätzlichen Modulen pro Seite bei einem kurzen Link. Die eine Einschränkung ist, dass Fehlerkorrektur und kleine Druckgröße um das gleiche Budget konkurrieren — ein Level-H-Code mit einem Logo muss größer gedruckt werden, nicht kleiner.
Warum funktioniert mein QR-Code nicht mehr, wenn ich eine Ecke abdecke?
Weil die Ecken keine Daten sind. Die drei großen Quadrate sind Erkennungsmuster, das kleinere Quadrat neben der unteren rechten Ecke ist ein Ausrichtungsmuster, und beide ermöglichen es einem Lesegerät, das Symbol zu lokalisieren und auszurichten, bevor es etwas dekodiert. Sie sind nicht durch Fehlerkorrektur geschützt — es gibt nichts, um sie zu rekonstruieren. In unserem Test machte eine Überdeckung eines Erkennungsmusters die Dekodierung bei nur 1 % der Symbolfläche unmöglich, gegenüber 17 % in der Mitte.
Braucht ein Logo auf einem QR-Code einen weißen Rand?
In der Praxis ja, und unsere Zahlen gehen von einem aus. Wir haben getestet, indem wir ein Quadrat weiß gemacht haben, was der beste Fall ist: ein sauberes, hochkontrastreiches Loch mit scharfen Kanten, das der Decoder als gleichmäßig hell behandeln kann. Ein direkt auf die Module aufgebrachtes Logo ohne Platte dahinter erzeugt mehrdeutige halbdunkle Module an seiner Kante, die mehr kosten als die gleiche Fläche sauberen Weißes.
- Scannen Foto-QR-Codes tatsächlich? Unsere Decode-Test-ErgebnisseEin QR-Code, der ein Foto ist, klingt nach schlechterer Lesbarkeit. Wir haben unseren mit einem echten Decoder gemessen — verschwommen, verkleinert und lesbar wie ein Reader liest.
- Wie klein kann ein QR-Code gedruckt werden? Die Größen, berechnetEs gibt keine einzige Mindestgröße für einen QR-Code. Wir haben fünf echte Payloads durch unseren eigenen Encoder verarbeitet, um die Modulanzahlen zu erhalten, und diese dann in Millimeter umgerechnet.