Jak duże może być logo na kodzie QR? Zmierzyliśmy
„30% korekcji błędów” to nie budżet na logo. Wybijaliśmy rosnące dziury w kodach na każdym poziomie EC, aż dekoder się poddał, i zapisaliśmy punkt załamania.
Co nowego tutaj: Największa wycentrowana łata, jaką kod QR tolerował na każdym poziomie korekcji błędów, zmierzona przez wybijanie rosnącej dziury w prawdziwym symbolu i dekodowanie go jsQR — 4% dla L, 7% dla M, 12% dla Q, 17% dla H — plus dwa wyniki, których nikt nie publikuje: rozproszone uszkodzenie łamie kod przy 4%, podczas gdy jedna ciągła plama przeżywa 17%, a ta sama łata nad wzorem wyszukiwania łamie go przy 1%.
Każdy poradnik o umieszczaniu logo na kodzie QR mówi to samo na dwa tematy: użyj poziomu korekcji błędów H i pamiętaj, że kod może odzyskać 30% swojej treści. Ta druga część powtarzana jest tak często, że stała się wytycznymi projektowymi — zakryj do 30% — a to nie jest to, co ta liczba oznacza.
Sprawdziliśmy, co ona naprawdę oznacza.
# Co naprawdę oznacza „30% korekcji błędów”
Kod QR nie przechowuje danych jako pikseli, z których można stracić kilka. Przechowuje słowa kodowe: bloki po osiem modułów, chronione korekcją błędów Reeda–Solomona. Główna wartość poziomu H opisuje mniej więcej, ile z tych słów kodowych można odtworzyć — a część tej pojemności zużywa narzut samego kodowania, zanim w ogóle cokolwiek ruszysz.
Dwie konsekwencje mają większe znaczenie niż ta liczba:
- Uszkodzenia liczy się na słowo kodowe, a nie na moduł. Zniszczenie jednego modułu niszczy całe słowo kodowe, do którego należy.
- Wzorce wyszukiwania, wzorce synchronizacji i informacje o formacie nie są w ogóle objęte korekcją błędów. To dzięki nim dekoder znajduje symbol, i nie ma z czego ich odtworzyć.
Zatem „30%” to fakt matematyczny, a nie zezwolenie na zasłanianie grafiki. Oto właśnie to zezwolenie.
# Zmierzony budżet logo, na poziom
Metoda, abyś mógł ją powtórzyć: zakoduj https://mqr.sh/AB12CD za pomocą enkodera, który dostarcza MostlyQR (buildMatrix, opakowujący licencjonowany na MIT node-qrcode), przypięty do wersji symbolu 3 (29 modułów) na każdym poziomie korekcji błędów, tak aby EC było jedyną zmienną. Wyrenderuj z 8 pikselami na moduł i pełną strefą ciszy o szerokości 4 modułów. Wybielaj wyśrodkowany kwadrat, zaczynając od 1% pola powierzchni symbolu i powiększając go o 1% za każdym razem, a piksele przekazuj do jsQR 1.4.0 po każdym kroku. Zapisywana liczba to ostatni rozmiar, który został zdekodowany przed pierwszą awarią.
| Korekcja błędów | Największa wyśrodkowana biała łata, którą nadal da się zdekodować |
|---|---|
| L | 4% pola powierzchni symbolu |
| M | 7% |
| Q | 12% |
| H | 17% |
Poziom H jest wart mniej więcej czterokrotnie więcej niż poziom L — to realna różnica i powód, dla którego każdy poradnik każe go używać. Nie jest to jednak nawet blisko 30%.
Jako przybliżoną regułę z tych liczb: na poziomie H wyśrodkowane logo zajmujące około 15% pola powierzchni kodu — kwadrat o szerokości mniej więcej 39% szerokości kodu — mieści się w zmierzonym limicie z pewnym zapasem. Zmierzony limit na poziomie M to 7%, czyli kwadrat o szerokości około 26%, więc po uwzględnieniu zapasu w ten sam sposób zostajesz z około jednej piątej.
Cały test powtórzyliśmy przy 16 pikselach na moduł i otrzymaliśmy identyczne wyniki, czego można było się spodziewać: to właściwość symbolu, a nie renderowania.
# Dlaczego plama jest tańsza niż konfetti
Oto wynik, którego się nie spodziewaliśmy, i to on wyjaśnia, dlaczego wyśrodkowane logo w ogóle działa.
Zamiast jednej ciągłej łaty, losowo odwracaliśmy pojedyncze moduły danych na całym symbolu — pozostawiając nietknięte wszystkie wzorce wyszukiwania, synchronizacji i wyrównania — i zwiększaliśmy ten odsetek, aż dekodowanie się nie udawało. Ten sam ładunek, ta sama wersja, ten sam dekoder, pięć różnych losowych ziaren.
| Korekcja błędów | Maksymalne rozproszone uszkodzenie (mediana z 5 przebiegów) |
|---|---|
| L | 1% z 567 modułów danych |
| M | 3% |
| Q | 3% |
| H | 4% |
(Symbol v3 ma 841 modułów, z czego 567 przenosi dane; reszta to wzorce wyszukiwania, synchronizacji, wyrównania i formatu, które ten test pozostawił w spokoju.)
Cztery procent rozproszone wobec siedemnastu procent w jednej plamie, na tym samym poziomie.
Powód leży w słowie kodowym. Ciągły kwadrat 17% niszczy całkowicie niewielką liczbę słów kodowych. Ta sama ilość uszkodzeń rozsypana równomiernie niszczy fragment wielu słów kodowych — a słowo kodowe z jednym złym modułem jest dokładnie tak samo zepsute jak słowo z ośmioma. Korekcja błędów liczy ofiary, a nie uszkodzenia.
To odwraca zwykły instynkt. Pojedynczy czysty kształt w jednym miejscu jest najtańszym sposobem wydania korekcji błędów. Posypywanie, tekstura, półprzezroczysty znak wodny lub filtr zdjęciowy na całym kodzie jest najdroższy, nawet jeśli wygląda na mniejsze uszkodzenie.
# Trzy narożniki, których nie wolno zakrywać
Ten sam test, ten sam rosnący kwadrat, przesunięty w dwa inne miejsca:
| Położenie łaty | Punkt załamania na poziomie H |
|---|---|
| środek | 17% |
| prawy dolny róg (nad wzorcem wyrównania) | 5% |
| lewy górny róg (nad wzorcem wyszukiwania) | 1% |
Na poziomie L przypadek lewego górnego rogu zawiódł już w pierwszym kroku — poniżej 1%.
Te narożniki to struktura, a nie treść. Trzy duże współśrodkowe kwadraty to wzorce wyszukiwania, a mniejszy, wcięty blisko prawego dolnego rogu, to wzorzec wyrównania; razem pozwalają dekoderowi ustalić, gdzie jest symbol, jak jest duży i jak jest obrócony lub zniekształcony. Zakryj jeden z nich, a nie ma już kroku dekodowania, do którego można dotrzeć. Poziom korekcji błędów prawie niczego tu nie zmienia, ponieważ korekcja błędów nigdy ich nie chroniła.
Dlatego bezpiecznym miejscem dla logo jest środek, i dlatego hasło „po prostu zmniejsz je i umieść w rogu” jest dokładnie odwrotne do tego, co trzeba zrobić.
# Co dodaje aparat, czego nie uwzględnia ten test
Wszystko powyżej to czysty, syntetyczny, najlepszy możliwy przypadek:
- Jeden dekoder. jsQR to dobry, szeroko używany dekoder, ale stos aparatu w telefonie to nie jsQR. Prawdziwe czytniki różnią się tym, jak agresywnie próbują odczytać uszkodzony kod.
- Idealne piksele. Bez rozmycia, odblasków, perspektywy i druku. Każdy z tych czynników zmniejsza budżet.
- Czysta biała dziura. Prawdziwe logo ma kolor, krawędzie i antyaliasing na tle modułów pod spodem. Biała płytka za logo nie jest dekoracją — to ona sprawia, że zakryty obszar jest jednoznaczny.
Traktuj tabelę jako górną granicę zmierzoną w idealnych warunkach, a nie cel, do którego należy projektować. Nasza własna rada to wykorzystać około dwóch trzecich tego budżetu.
# Powtórzenie tego samodzielnie
Każdą liczbę powyżej wypisuje skrypt, a nie wpisany ręcznie do artykułu: draft/mostlyqr/seo/benchmarks/logo.js w naszym repozytorium. Renderuje symbol na każdym poziomie, powiększa każdą łatę o jeden procent na raz, przeprowadza porównanie rozproszonych uszkodzeń dla pięciu ziaren i powtarza całość w drugiej skali pikseli. Sprawdza też nasz własny walidator pod kątem granicy przytoczonej na końcu tego tekstu.
# Co faktycznie zrobić
- Użyj poziomu korekcji błędów H, gdy masz logo. Mniej więcej poczwórnie zwiększa to Twój budżet, a kosztuje około czterech dodatkowych modułów na bok przy krótkim linku — co jest decyzją o rozmiarze, którą możesz obliczyć, zamiast zgadywać.
- Trzymaj logo na środku i utrzymuj je poniżej około 15% pola powierzchni kodu. To kwadrat o szerokości około 39% szerokości kodu, na poziomie H.
- Umieść je na jednolitej płytce, aby zakryty obszar był czysty, a nie niejednoznaczny.
- Nigdy nie pozwól, by cokolwiek dotykało trzech kwadratów w rogach — ani logo, ani ramki, ani przycięcia z zaokrąglonymi rogami.
- Przetestuj rzeczywisty wydruk słabym telefonem. Każda liczba tutaj mówi, które projekty warto testować. Tylko test mówi, czy działa.
Jeśli chcesz, aby obraz był całym kodem, a nie łatą w jego środku, to inna technika z innym budżetem — kody QR ze zdjęciem zmierzyliśmy osobno, i okazuje się, że nie zużywają w ogóle korekcji błędów. A jeśli po prostu chcesz kod z Twoim logo, generator MostlyQR podnosi korekcję błędów do poziomu H w chwili dodania logo, zachowuje strefę ciszy o szerokości 4 modułów i domyślnie ustawia logo na 22% szerokości kodu — 4,8% jego pola powierzchni, bezpiecznie w granicach wszystkiego, co zmierzyliśmy powyżej.
Jedna uczciwa uwaga o naszym własnym kodzie, skoro publikujemy liczby: zabezpieczenie, które odrzuca zbyt duże logo, używa nominalnej wartości odzysku 30% z 15% marginesem ostrożności, więc zaakceptuje logo zajmujące około 25% pola powierzchni na poziomie H. Nasz pomiar mówi, że realny sufit jest bliższy 17%. Domyślne ustawienie, którego nikt nie zmienia, jest bezpieczne z dużym zapasem, ale limit jest luźniejszy, niż przemawiają za tym dowody, i jest to błąd w naszym walidatorze, a nie subtelność kodów QR. Jest on na liście rzeczy do naprawienia.
Często zadawane pytania
Czy logo może zajmować 30% kodu QR?
Nie. „30%” na poziomie korekcji H odnosi się do słów kodowych — bloków po osiem modułów, które Reed-Solomon potrafi odtworzyć — a część tego budżetu jest już wydana na samo kodowanie, a nie zostawiona w rezerwie dla ciebie. W naszym teście największy wycentrowany kwadrat, jaki udało się wybielić w kodzie poziomu H i nadal zdekodować, to 17% powierzchni symbolu. Na poziomie L było to 4%. Traktuj 30% jako opis matematyki, a nie jako dopuszczalny rozmiar projektu.
Jakiego poziomu korekcji błędów użyć w kodzie QR z logo?
H, jeśli możesz sobie na nią pozwolić rozmiarowo. W naszym pomiarze w przybliżeniu poczwórnie zwiększyła tolerowaną wycentrowaną łatę w porównaniu z poziomem L (17% wobec 4%), kosztem czterech dodatkowych modułów na bok przy krótkim linku. Jedno zastrzeżenie: korekcja błędów i mały wydruk konkurują o ten sam budżet — kod poziomu H z logo trzeba drukować większy, a nie mniejszy.
Dlaczego mój kod QR przestaje działać, gdy zasłonię róg?
Bo rogi nie są danymi. Trzy duże kwadraty to wzory wyszukiwania, a mniejszy kwadrat blisko prawego dolnego rogu to wzór wyrównania; oba służą czytnikowi do zlokalizowania i wyrównania symbolu, zanim cokolwiek zdekoduje. Nie chroni ich korekcja błędów — nie ma z czego ich odtworzyć. W naszym teście łata nad wzorem wyszukiwania złamała dekodowanie przy 1% powierzchni symbolu, wobec 17% w środku.
Czy logo na kodzie QR potrzebuje białej ramki?
W praktyce tak, a nasze liczby to zakładają. Testowaliśmy, wybielając kwadrat — to przypadek najlepszy: czysta, wysoko kontrastowa dziura o ostrych krawędziach, którą dekoder może potraktować jako jednolicie jasną. Logo położone wprost na modułach, bez płytki pod spodem, daje niejednoznaczne, na wpół ciemne moduły wokół krawędzi, a te kosztują więcej niż taka sama powierzchnia czystej bieli.
- Czy zdjęciowe kody QR naprawdę się skanują? Wyniki naszych testówZdjęciowy kod QR wydaje się gorzej skanować. Sprawdziliśmy go prawdziwym dekoderem — rozmytego, pomniejszonego i odczytanego tak, jak robi to czytnik.
- Jak mały może być wydrukowany kod QR? Rozmiary, wyliczoneNie ma jednego minimalnego rozmiaru kodu QR. Pięć prawdziwych ładunków przepuściliśmy przez nasz koder, by policzyć moduły, a potem zamieniliśmy je na milimetry.