Ali se fotografske kode QR skenirajo? Rezultati testov
Koda 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.
Kaj je tukaj novega: Rezultati dekodiranja naše lastne fotografske kode QR, izmerjeni s knjižnico jsQR proti navadni kontrolni kodi: nobeden od 4,225 modulov ni bil napačno prebran pri vseh odprtinah bralnika od 0.10 do 0.45 modula, enaka toleranca na 3-kratno pomanjšanje in toleranca na zamegljenost 4–5 pikslov proti 6 pikslom pri navadni kodi — konkretna, majhna cena pretvorbe kode v sliko.
QR koda, ki je fotografija, se zdi kot kompromis: lepa, a nekaj skeniranj izgubiš. Ta intuicija drži pri večini izvedb in je napačna glede tega, kako mora delovati — “nekaj skeniranj” pa ni številka, ki bi jo kdorkoli objavil.
Tukaj so naše, iz testnega paketa, ki je moral uspeti, preden smo funkcijo sploh smeli izdati.
# Kaj je fotografska koda QR in kaj ni
Pod istim imenom se skrivata dve zelo različni stvari.
QR umetnost z umetno inteligenco — tista z difuzijskimi modeli — ustvari sliko, ki temelji na kodi QR, nato pa upa, da se rezultat še vedno da prebrati. Včasih se. Napaka je neopazna, dokler nekdo v temni akciji ne usmeri tri leta starega telefona vanjo.
Ditherirana fotografska koda je drugi pristop in tisti, ki je tukaj izmerjen. Slika se zmanjša na en bit — črno ali belo za vsak pod-piksel — z razpršitvijo napake, pri čemer velja ena ključna omejitev: v središču vsakega modula je dithering prisiljen na vrednost, ki jo zahteva kodirnik, napaka, ki jo ta prisilitev ustvari (do približno 95 % vrednosti piksla, za belo polje v temnem območju), pa se potisne v sosednje pod-piksle, ki še niso bili pragovno obdelani. Slika je sestavljena iz prostora med središči modulov.
Ta razlika je bistvo celotnega članka. Pomeni, da koda ne porablja svoje korekcije napak za okrasje: vsak modul še vedno nosi vrednost kodirnika, zato je celotna redundanca ohranjena za zgibe, bleščanje, palec čez en kot — prav tisto, za kar korekcija napak sploh obstaja.
# Test
Vse spodaj je mogoče ponovno preveriti iz našega repozitorija, brez povezave:
- Kodirnik: naš lastni
packages/qr, korekcija napak H, najnižja gostotaminVersion: 12→ različica simbola 12, 65 modulov v širino, 10 pikslov na modul, 4-modulna tiha cona. - Slogi: halftone (pravo ditherirano fotografija) in mosaic (rišejo se samo moduli, velikost pa je odvisna od lokalne temnosti), proti navadni nediterirani kodi kot kontroli — isti podatki, ista različica, isto merilo.
- Slike: proceduralne testne slike, vključno z diagonalnim prehodom (pojavi se vsak ton) in enakomerno sivo sredino, ki je najslabši primer, ker se vsaka prisiljena pika razlikuje od okolice.
- Dekoder: jsQR 1.4.0, pravi QR dekoder, ki dobi dejanske piksle.
- Degradacije: zmanjšanje z najbližjim sosedom, zameglitev z box blurom, ki ji sledi ponovno pragovno določanje (nefokusirana kamera), in branje z odprtino.
Paket, na katerem temelji to, je packages/qr/test/dither.test.js. Izvedel se je 39/39 uspešno dne 31. avgusta 2026, koda, ki se ne da prebrati, pa je neuspešen test, ne opozorilo — to pravilo je razlog, da funkcija obstaja v taki obliki. Spodnje tabele natisne draft/mostlyqr/seo/benchmarks/photo.js, ki iste sloge zažene skozi iste degradacije; nič tukaj ni bilo prepisano ročno.
# Nič napačno prebranih modulov, pri vsaki odprtini
Meritev, ki šteje najbolj, ni “ali se je dekodiralo”, ampak “ali je bralnik v vsaki celici videl pravilno vrednost”, ker koda, ki se dekodira samo zato, ker je korekcija napak rešila položaj, bo odpovedala, ko se zgodi kaj drugega.
Skladen bralnik ne vzorči enega piksla na modul. Pri vsakem središču modula povpreči majhno krožno odprtino in to povprečje pragovno določi. Enako smo naredili tudi mi, pri polmerih odprtine 0.10, 0.25, 0.36 in 0.45 modula (0.5 bi bil cel modul), in prešteli, koliko od 4.225 modulov bi bilo prebranih napačno:
| Slog | Napačno prebrani moduli, odprtina 0.10 / 0.25 / 0.36 / 0.45 |
|---|---|
| navadna koda (kontrola) | 0 / 0 / 0 / 0 |
| mozaična fotografija | 0 / 0 / 0 / 0 |
| halftone fotografija (prehod) | 0 / 0 / 0 / 0 |
| halftone fotografija (enakomerno siva, najslabši primer) | 0 / 0 / 0 / 0 |
Ni niti enega modula, v nobenem slogu, pri nobeni odprtini, tudi na najslabši sliki. Fotografska koda in navadna koda bralniku predstavita iste vrednosti. Korekcija napak ostane nedotaknjena in je še vedno v celoti na voljo.
# Koliko stane: približno en korak zameglitve
Nedotaknjena korekcija napak ne pomeni enakega. Dithering dejansko spremeni, kako pikseli izgledajo med središči, slabo nefokusirana kamera pa te piksle povpreči skupaj. Zato smo vsak slog potisnili, dokler se ni pokvaril:
| Slog | Največje zmanjšanje, ki se je še dekodiralo | Največji polmer zameglitve, ki se je še dekodiral |
|---|---|---|
| navadna koda (kontrola) | 3× | 6 px |
| mozaična fotografija | 3× | 5 px |
| halftone fotografija (enakomerno siva) | 3× | 6 px |
| halftone fotografija (prehod) | 3× | 4 px |
Zmanjšanje — koda, prikazana manjša od nativne velikosti — je enako pri vseh slogih: vsak je preživel 3× in vsak se je prvič pokvaril pri 4×. (Zmanjševanje z najbližjim sosedom ni monotono — nekateri so se pri 5× spet dekodirali, ker je vzorčna mreža naletela na ugodnejšo lego — zato poročamo o prvi napaki, ne o zadnjem uspehu.)
Stroški se pokažejo pri zameglitvi, in to samo pri slogu halftone na najtežji sliki: za tretjino manj rezerve kot pri navadni kontrolni kodi. Halftone enakomerno sivega polja se je popolnoma ujemal z navadno kodo, zato je ta strošek odvisen od slike in ni lastnost tehnike. Preprosto povedano: fotografska koda potrebuje, da je kamera približno za en korak bolj ostra kot pri navadni kodi. To je pravi strošek in je majhen, in to je pošten odgovor na vprašanje “ali se skenira?” — ne “da” in ne “ne”, ampak “da, z za približno en korak manj tolerance ostrine”.
Mozaični slog je med obema, kar ima smisel: riše samo module, zato je med središči manj črnila, ki bi ga zameglitev lahko razmazala.
# Zakaj je gostota pravi pogoj
Prva različica te funkcije je bila tehnično pravilna in vseeno je izgledala napačno, iz razloga, ki je vredno poznati, če uporabljaš katero koli orodje za fotografske kode QR:
https://mqr.sh/AB12CD pri korekciji napak H — kar fotografska koda vsili — se zakodira v mrežo 29 modulov. To je 841 celic za celo fotografijo, rezultat pa se bere kot šum in ne kot slika: ljudje sklenejo, da tehnika ne deluje, čeprav je pravi problem v tem, da slika nima prostora.
Vsiljena gostejša simbolika to popravi:
| Najnižja različica | Simbol | Moduli v širino | Razpoložljive celice za sliko |
|---|---|---|---|
| brez (kar podatki potrebujejo) | v3 | 29 | 841 |
| 8 | v8 | 49 | 2.401 |
| 12 (naša privzeta) | v12 | 65 | 4.225 |
Petkrat več celic pri različici 12. Vsako resnejše orodje za slikovne kode QR iz istega razloga to vsili višje, tlak gostote pa nikoli ne sme skrčiti simbola pod to, kar podatki dejansko potrebujejo — podatki imajo vedno prednost pred gostoto.
Posledica za tiskanje je neposredna, in to je razlog, da ta članek sodi v isto skupino kot koliko modulov potrebujejo tvoji podatki: koda s 65 moduli potrebuje 73 širin modulov papirja, vključno s tiho cono. Pri modulu 0.5 mm je to 36.5 mm — zato je fotografska koda plakat, meni, embalažni panel ali zaslon. Ni vizitka.
# Kaj test ne pokriva
Povedano jasno, ker je merilo z nenavedenimi omejitvami slabše od nobenega:
- En dekoder, sintetični pikseli. jsQR je pravi dekoder, vendar ni sklad kamere telefona, vhod pa je čist izrisan izhod, ne fotografija natisnjene stvari.
- Brez tiska, brez bleščanja, brez perspektive, brez gubanja. Vsak od teh zmanjša rezervo, pri fotografski in navadni kodi pa to stane različno.
- Brez barve. To so 1-bitne črno-bele kode.
- Naša lastna izvedba. Tukaj ni nič o fotografijah ali kodah QR z umetno inteligenco pri drugih. Če prepisujejo module in se pri popravljanju škode zanašajo na korekcijo napak, se bodo obnašale čisto drugače, pošten test pa je tisti zgoraj, izveden nad njimi.
# Kdaj jo uporabiti
- Da: plakati, meniji pod steklom, embalažni paneli, zasloni, razstavna grafika, vse, kar se natisne veliko.
- Verjetno: naslovnica albuma, ovitek knjige, velika nalepka izdelka — preizkusi.
- Ne: vizitke, papirni letaki, ki se zvijajo, vse, kar je manjše od približno 35 mm, vse, kar se skenira pri slabi svetlobi na daljavo.
In če želiš ne celotno fotografijo, ampak svoj logotip sredi sicer običajne kode, gre za drugo tehniko z veliko manjšim proračunom — tudi to smo izmerili, kako velik lahko postane logotip, odgovor pa je manjši, kot si internet predstavlja.
Fotografske kode QR podjetja MostlyQR so izvedba, ki je tukaj izmerjena. Isto jedro ditheringa teče v predogledu v brskalniku in v PNG, ki ga izriše strežnik, zato je tisto, kar vidiš v graditelju, tisto, kar dobi tiskarna. Opomba v graditelju pravi “najboljše na zaslonih in velikih tiskih — fotografska koda je težje berljiva na majhnem ali zguban papirju”, kar se po teh številkah zdi prav, da to pove.
Pogosta vprašanja
Ali se fotografske kode QR zanesljivo skenirajo?
V naših testih da — z enim merljivim stroškom. Ko naše fotografske kode beremo tako kot skladen bralnik, s povprečenjem krožne odprtine v središču vsakega modula, ni bil napačno prebran niti eden od 4,225 modulov pri nobeni testirani odprtini. Prenesle so enako 3-kratno pomanjšanje kot navadna koda. Edina izmerjena razlika je bila zamegljenost in le na najtežji sliki: navadna kontrolna koda je zdržala zamegljenost polmera 6 pikslov, mozaični slog 5 in polprikazni slog 4 na prehodu barv (6 na enobarvni sivi). To je približno en korak ostrenja fotoaparata, ne drugačna kategorija zanesljivosti.
Ali umetniške kode QR porabijo popravek napak?
Mnoge izvedbe ga, zato ima ta tehnika slab sloves. Naša ne. Namesto da bi cele module prepisali s podatki slike in se zanašali, da jih bo Reed-Solomon popravil, na središče vsakega modula vsilimo piko z vrednostjo, ki jo zahteva kodirnik, nastalo napako pa razpršimo v okoliške podpiksle. Slika se plača iz prostora med središči modulov, zato je celoten proračun za popravek napak še vedno na voljo za resnični svet — za zgibe, odsev in palec čez vogal.
Ali lahko fotografsko kodo QR natisnem na letak?
Ne bi priporočali. Naš lastni graditelj pravi „najboljše na zaslonih in velikih tiskih“, in mislimo resno: fotografska koda potrebuje gosto simbolo (65 modulov na stran v spodnjem testu, proti 29 za isto kratko povezavo brez prilagoditve), zato je pri velikosti letaka vsak modul zelo hitro zelo majhen. Plakati, jedilniki pod steklom, embalaža in zasloni so pravo mesto. Papirni letak, ki ga zložijo v žep, ni.
Zakaj je moja fotografska koda QR videti kot šum, ne kot slika?
Skoraj vedno zato, ker je simbol preveč grob. Kratka povezava pri popravku napak H se kodira v mrežo 29 modulov — 841 celic, premalo za prepoznavno sliko, zato zanjo ni prostora. Gostejši simbol to popravi: različica 8 ima 49 modulov, različica 12 pa 65 (4,225 celic, petkrat toliko), zato naš graditelj za fotografske kode privzeto uporablja različico 12. Podatki imajo vedno prednost, zato daljši podatki še vedno dobijo večji simbol.
- 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.
- 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.