Kako velik sme biti logotip na kodi QR? Izmerili smo
„30% popravka napak“ ni proračun za logotip. Vrtali smo vse večje luknje v kode na vsaki stopnji, dokler pravi dekoder ni odpovedal.
Kaj je tukaj novega: Največje središčno polje, ki ga je koda QR prenesla na vsaki stopnji popravka napak, izmerjeno z vrtanjem vse večje luknje v pravi simbol in dekodiranjem s knjižnico jsQR — 4% pri L, 7% pri M, 12% pri Q, 17% pri H — ter dva rezultata, ki jih nihče ne objavlja: razpršena škoda zlomi kodo pri 4%, enotna mrlja pa preživi 17%, isti vzorec čez iskalni vzorec pa zlomi kodo pri 1%.
Vsak vodnik o tem, kako na QR kodo postaviti logotip, pove isti dve stvari: uporabi stopnjo popravljanja napak H in ne pozabi, da lahko koda obnovi 30 % sebe. Druga polovica se ponavlja tako pogosto, da je postala oblikovalski zapis — prekrij do 30 % — in to ne pomeni tega, kar pomeni število.
Šli smo pogledat, kaj pomeni res.
# Kaj “30 % popravljanja napak” dejansko pomeni
QR koda svojih podatkov ne shranjuje kot slikovne pike, ki jih lahko nekaj izgubi. Shranjuje kodne besede: bloke po osem modulov, zaščitene z Reed–Solomonovim popravljanjem napak. Glavna številka stopnje H opisuje približno, koliko teh kodnih besed je mogoče rekonstruirati — in del te zmogljivosti pojé lastni režijski strošek kodiranja, še preden se karkoli dotakneš.
Dve posledici, ki sta pomembnejši od številke:
- Poškodbe se štejejo po kodni besedi, ne po modulu. Uničen en modul uniči celotno kodno besedo, ki mu pripada.
- Iskalni vzorci, časovni vzorci in informacije o formatu niso pokriti s popravljanjem napak. Z njimi bralnik sploh najde simbol, in ničesar ni, iz česar bi jih lahko rekonstruiral.
Torej je “30 %” dejstvo o matematiki in ne dovoljenje za sliko. Tu je dovoljenje.
# Izmerjeni proračun za logotip po stopnjah
Metoda, da jo lahko ponoviš: kodiraj https://mqr.sh/AB12CD z kodirnikom, ki ga MostlyQR prilaga (buildMatrix, ovitim okoli MIT knjižnice node-qrcode), pripetim na različico simbola 3 (29 modulov) na vseh stopnjah popravljanja napak, tako da je EC edina spremenljivka. Upodobi pri 8 slikovnih pikah na modul s polno tiho cono 4 modulov. Pobeli osrednji kvadrat, ki se začne pri 1 % površine simbola in se povečuje po 1 % naenkrat, in po vsakem koraku slikovne pike predaj jsQR 1.4.0. Zabeleži se zadnja velikost, ki se je še dekodirala, pred prvo napako.
| Popravljanje napak | Največja središčna bela krpa, ki se je še dekodirala |
|---|---|
| L | 4 % površine simbola |
| M | 7 % |
| Q | 12 % |
| H | 17 % |
Stopnja H vredna približno štirikrat toliko kot stopnja L — resnična razlika in razlog, da vsak vodnik priporoča njo. Vendar je daleč od 30 %.
Kot splošno pravilo iz teh številk: pri stopnji H je središčni logotip, ki zavzema približno 15 % površine kode — kvadrat približno 39 % širine kode — v izmerjeni meji z nekaj prostora. Izmerjena meja pri stopnji M je 7 %, to je kvadrat približno 26 % širine, zato ga omeji na enak način in pristaneš pri približno petini.
Celoten postopek smo ponovili pri 16 slikovnih pikah na modul in dobili enake rezultate, kar je pričakovano: gre za lastnost simbola, ne upodabljanja.
# Zakaj je blob cenejši od konfetov
Tu je rezultat, ki smo ga pričakovali manj, in prav on pojasni, zakaj središčni logotipi sploh delujejo.
Namesto enega sklenjenega krpa smo naključno obrnili posamezne podatkovne module po celotnem simbolu — pustili smo nedotaknjene vse iskalne, časovne in poravnalne vzorce — in stopnjo povečevali, dokler dekodiranje ni odpovedalo. Ista vsebina, ista različica, isti bralnik, pet različnih naključnih semen:
| Popravljanje napak | Največja raztresena poškodba (mediana 5 poskusov) |
|---|---|
| L | 1 % od 567 podatkovnih modulov |
| M | 3 % |
| Q | 3 % |
| H | 4 % |
(Simbol v3 ima 841 modulov, od katerih 567 nosi podatke; ostali so iskalni, časovni, poravnalni in formatni vzorci, ki jih ta test ni spreminjal.)
Štiri odstotke raztresenih poškodb proti sedemnajstim odstotkom v enem blobu, pri isti stopnji.
Razlog je kodna beseda. Sklenjen kvadrat 17 % uniči majhno število kodnih besed v celoti. Enaka količina poškodbe, razpršena enakomerno, pokvari kos mnogih kodnih besed — in kodna beseda z eno slabo točko je prav tako pokvarjena kot kodna beseda z osmimi. Popravljanje napak šteje žrtve, ne poškodb.
To obrne običajni inštinkt. Ena čista oblika na enem mestu je najcenejši način, kako porabiti popravljanje napak. Pikčenje, tekstura, polprosojen vodni žig ali fotografski filter čez celotno kodo sta najdražja, tudi kadar se zdita kot manjša poškodba.
# Tri vogale, ki jih ne smeš prekriti
Isti test, isti rastoči kvadrat, premaknjen na dva druga položaja:
| Položaj krpe | Meja pri stopnji H |
|---|---|
| sredina | 17 % |
| spodnji desni vogal (čez poravnalni vzorec) | 5 % |
| zgornji levi vogal (čez iskalni vzorec) | 1 % |
Pri stopnji L je zgornji levi primer odpovedal že ob prvem koraku — pod 1 %.
Ti vogali so struktura, ne vsebina. Tri velike koncentrične kvadrate so iskalni vzorci, manjši, zamaknjen blizu spodnjega desnega kota, pa je poravnalni vzorec; med njimi bralnik ugotovi, kje je simbol, kako velik je in kako je zasukan ali nagnjen. Če prekriješ enega, ne ostane nobenega dekodirnega koraka, do katerega bi prišel. Stopnja popravljanja napak skoraj nič ne spremeni, ker popravljanje napak teh vzorcev nikoli ni varovalo.
Zato je varno mesto za logotip sredina, in zato je “naredi ga manjšega in ga daj v vogal” ravno obratno.
# Kaj kamera doda, česar ta test ne zajame
Vse zgoraj je čist, sintetičen primer v najboljših pogojih:
- En bralnik. jsQR je dober, široko uporabljen bralnik, vendar sklad kamere v telefonu ni jsQR. Pravi bralniki se razlikujejo v tem, kako agresivno poskušajo poškodovano kodo.
- Popolne slikovne pike. Brez zamegljenosti, bleska, perspektive in tiska. Vsaka od teh stvari zmanjša proračun.
- Čista bela luknja. Pravi logotip ima barvo, robove in glajenje proti modulom pod njim. Bela podlaga za logotipom ni okrasek — prav ona naredi prekrito območje nedvoumno.
Tabelo obravnavaj kot zgornjo mejo, izmerjeno v idealnih pogojih, ne kot cilj, do katerega bi oblikoval. Naš nasvet je porabiti približno dve tretjini te meje.
# Ponovno zagon tega sam
Vsako številko zgoraj natisne skripta in ni vtipkana v članek: draft/mostlyqr/seo/benchmarks/logo.js v našem repozitoriju. Upodobi simbol na vsaki stopnji, povečuje vsako krpo po en odstotek naenkrat, izvede primerjavo raztresene poškodbe čez pet semen in celoten postopek ponovi pri drugi velikosti slikovnih pik. Preveri tudi naš lastni validator glede meje, navedene na koncu tega prispevka.
# Kaj dejansko storiti
- Uporabi stopnjo popravljanja napak H, kadar imaš logotip. Proračun se približno štirikrat poveča, stane pa približno štiri dodatne module na stran pri kratki povezavi — kar je odločitev o velikosti, ki jo lahko izračunaš, namesto da bi ugibal.
- Logotip drži na sredini in pod približno 15 % površine kode. To je kvadrat približno 39 % širine kode pri stopnji H.
- Postavi ga na trdno podlago, da je prekrito območje čisto in ne nejasno.
- Nikoli ne pusti, da se česa koli dotakne tri vogalne kvadrate — ne logotip, ne okvir, ne izrez z zaobljenimi vogali.
- Preizkusi dejanski tisk s slabim telefonom. Vse številke tu povedo, katere zasnove so vredne preizkusa. Samo preizkus pove, ali deluje.
Če želiš, da je slika celotna koda in ne krpa na sredini, gre za drugo tehniko z drugim proračunom — fotografske QR kode smo izmerili ločeno, in izkaže se, da ne porabijo nobenega popravljanja napak. In če želiš preprosto kodo z logotipom, generator MostlyQR ob dodajanju logotipa samodejno dvigne popravljanje napak na stopnjo H, ohrani 4-modulsko tiho cono in privzeto nastavi logotip na 22 % širine kode — 4,8 % njene površine, močno znotraj vsega, kar je izmerjeno zgoraj.
Ena iskrena opomba o lastni kodi, ker objavljamo številke: zaščita, ki zavrne preveliki logotip, uporablja nominalno priporočeno 30-odstotno obnovitev z 15-odstotnim odbitkom, zato bo pri stopnji H sprejela logotip, ki prekriva približno 25 % površine. Naša meritev pravi, da je dejanska meja bližje 17 %. Privzeta vrednost, ki je nihče ne spreminja, je varna z veliko rezervo, vendar je omejitev ohlapnejša, kot jo dokazi podpirajo, in to je napaka v našem validatorju, ne podrobnost o QR kodah; uvrščena je na seznam popravkov.
Pogosta vprašanja
Ali lahko logotip pokrije 30% kode QR?
Ne. „30%“ pri stopnji popravka napak H se nanaša na kodne besede — bloke osmih modulov, ki jih Reed-Solomon lahko rekonstruira — in del tega proračuna je že porabljen za samo kodiranje, ni pa na voljo kot rezerva zate. V našem testu je bil največji središčni kvadrat, ki smo ga lahko pobelili na kodi H in je bila še dekodirana, 17% površine simbola. Pri stopnji L je bilo 4%. Obravnavaj 30% kot opis matematike, ne kot dovoljenje za oblikovanje.
Katero stopnjo popravka napak naj uporabim za kodo QR z logotipom?
H, če si lahko privoščiš večjo velikost. V naši meritvi se je dopustni središčni prostor v primerjavi s stopnjo L približno štirikrat povečal (17% proti 4%), za ceno štirih dodatnih modulov na stran pri kratki povezavi. Edino opozorilo: popravek napak in majhna tiskana velikost tekmujeta za isti proračun — koda H z logotipom mora biti natisnjena večja, ne manjša.
Zakaj koda QR preneha delovati, ko pokrijem vogal?
Ker vogali niso podatki. Tri velika kvadrata so iskalni vzorci, manjši kvadrat blizu spodnjega desnega kota pa je poravnalni vzorec; oba bralniku služita za iskanje in poravnavo simbola, preden karkoli dekodira. Popravek napak ju ne varuje — iz česa bi ju sploh rekonstruiral? V našem testu je pokritje iskalnega vzorca dekodiranje prekinilo pri 1% površine simbola, v sredini pa šele pri 17%.
Ali mora logotip na kodi QR imeti belo obrobo?
V praksi da, in naša števila to predpostavljajo. Testirali smo tako, da smo pobelili kvadrat, kar je najboljši primer: čista, visoko kontrastna luknja z ostrimi robovi, ki jo dekoder lahko obravnava kot enakomerno svetlo. Logotip, položen neposredno na module brez podlage, ustvari dvoumne napol temne module ob robu, kar stane več kot enako območje čiste bele barve.
- Ali se fotografske kode QR skenirajo? Rezultati testovKoda QR, ki je fotografija, se zdi, da mora slabše delovati. Izmerili smo jo s pravim dekoderjem — zamegljeno, pomanjšano in prebrano kot pravi bralnik.
- Kako majhna sme biti natisnjena koda QR? Velikosti, izračunaneNi ene same najmanjše velikosti za kodo QR. Pet resničnih vsebin smo prek lastnega kodirnika pretvorili v število modulov, nato pa v milimetre.