qr-codes

Schrijf je in op onze nieuwsbrief en ontvang elke week het beste van Clickx in je mailbox.

Sinds de coronacrisis zijn QR-codes alomtegenwoordig. Zoals bijvoorbeeld in de horeca, als vervanging van een fysiek menu. Maar hoe werkt zo’n code nu precies? Het systeem bestaat al sinds 1994 (!), maar is pas het afgelopen decennium en dan zeker de laatste jaren echt wijd verspreid. Op zich is zo’n Quick Response-code de moderne variant van de streepjes- of barcode die we allemaal al lang kennen, maar dan wel een stuk geavanceerder. Een streepjescode kan alleen van boven naar beneden worden gelezen en is dus niet geschikt voor grote hoeveelheden data. Vandaar dat het meestal beperkt blijft tot numerieke informatie, zoals de prijs of het serienummer van een product. De tweedimensionale QR-codes kunnen van beneden naar boven én van rechts naar links gelezen worden en hebben dus een veel grotere capaciteit.

Een beetje geschiedenis

Het concept van de QR-code werd ontwikkeld in Japan door Masahiro Hara, toen die als ingenieur bij Denso Wave zocht naar een manier om de auto-onderdelen die moederbedrijf Denso produceert, sneller en makkelijker te kunnen identificeren en volgen. Dit op verzoek van grote klant Toyota. Leuk detail: hij werd geïnspireerd door het in bepaalde delen van Azië populaire bordspel Go. Niet gewoon voor de witte en zwarte deeltjes, maar het gaf hem ook het idee om de data in twee richtingen de coderen, in plaats van gewoon in één richting (zoals bij een streepjescode). De firma nam geen patent op deze vernieuwing en ging voor een open broncode, zodat iedereen deze code kan maken en gebruiken. Wil je zelf een QR-code maken? Online vind je heel wat generatoren waar je dit relatief makkelijk kan. Op zich lijkt een QR-code een willekeurige verzameling van hokjes, maar niets is minder waar…

spelletje Go
Een spelletje Go.

Basisopbouw van de code

De basis van een QR-code wordt dus gevormd door een grotere, vierkante vorm, opgedeeld in zwarte en witte vierkantjes of pixels, waarbij de ene kleur staat voor 0 en de andere voor 1, oftewel de bits van een binaire code. Het minimum aantal pixels is 21×21 (versie 1 genoemd) en het kan helemaal gaan tot 177×177 vakjes (versie 40). Beide dimensies van elke versie tellen steeds vier pixels meer dan de vorige. Een code is steeds omringd door een witte rustzone als afbakening. In de twee bovenhoeken en die links beneden zie je altijd drie dezelfde patronen, de Finder Patterns, vaak opvallend groter dan de rest van de code. Deze patronen zorgen voor de herkenbaarheid van een QR-code. Niet alleen maar visueel, want zo wordt deze ook correct geïdentificeerd door een scanner. Vanaf versie 2 worden bovendien blokjes van 5 op 5 vakjes in het patroon geïntegreerd die dienen als extra oriëntering, de Alignment Patterns. Bij versie 1 ga je dat patroon dus niet terugvinden. Het is hierdoor dat een QR-code kan worden gelezen vanuit een schuine hoek en niet alleen door er netjes loodrecht over te gaan met je scanner. Bij de kleinere versies (2 tot en met 6) wordt er eentje nogal rechtsonder geplaatst en hoe groter de code, hoe meer van deze blokjes er symmetrisch over het vlak worden verdeeld. De eerder vermelde grote vlakken worden ter hoogte van kolom en rij 6 ook nog eens met elkaar verbonden door een reeks vakjes die helpen bij de synchronisatie van het lezen van de code. Ze helpen om de positie van de andere vakjes te herkennen. Deze worden Timing Patterns genoemd en bestaan steeds uit afwisselende zwarte en witte vakjes.

Verdere opbouw

Om het scannen zo vlot mogelijk te maken en de data dus zo correct en makkelijk te laten lezen zijn er nog wel enkele extra vakjes die worden gebruikt. Vanaf het 7de staat de versie bijvoorbeeld gewoon in de code, hiervoor worden telkens tweemaal enkele vakjes voorzien die zich steeds (gespiegeld naar elkaar) naast de Finder Patterns bevinden. Daarnaast zijn er ook enkele vakjes gereserveerd die worden voorzien om mogelijke fouten op te lossen. Hiervoor wordt gebruik gemaakt van dezelfde wiskundige formule die ook wordt gebruikt bij cd’s of dvd’s om ze leesbaar te houden, ondanks eventuele (lichte) schade: de Reed-Solomoncode. Deze formule is niet eenvoudig, maar werkt via redundante informatie. Wat neerkomt op het feit dat die informatie meerdere keren voorkomt. Als er dus iets mis is met de ene verzameling van info, is er dan nog steeds de andere die kan worden uitgelezen. Als de scanner dan toch niet goed kan lezen met welke versie die te maken heeft, herstellen deze vakjes de informatie en wordt die alsnog geregistreerd. Er zijn vier niveaus: L kan ongeveer 7 procent corrigeren, Bij M is dat 15 procent, Q kan 25 procent aan en H is het hoogste niveau en corrigeert ongeveer 30 procent. Dankzij deze verschillende manieren voor correcties is het bijvoorbeeld ook mogelijk om een QR-code te lezen waarin een extra element zoals een logo is verwerkt. De effectieve data (en wederom enkele vakjes die errors tegengaan) bevindt zich in de rest van de QR-code, verspreid over het vlak.

qr-code scannen

Om te voorkomen dat de witte en zwarte vlakken in of door elkaar lopen voor de scanner, wordt er gebruik gemaakt van een masker, een patroon dat ervoor zorgt dat de kleur van een aantal vakjes wordt veranderd naargelang het patroon van de data, zodat de scanner het verschil ziet tussen grotere blokken van dezelfde kleur. Er zijn 8 verschillende maskers, van 0 tot en met 7. Elk masker volgt een bepaalde formule om na te gaan welke pixels er eentje moeten krijgen. Het ene masker wordt bijvoorbeeld over alle even genummerde rijen geplaatst, het andere misschien over elke derde kolom. Net als de eventuele versies en bijhorende vakjes voor errors, bevinden ook deze codes zich tweemaal en gespiegeld langs de Finder Patterns. Dit gebied is de formatting zone. Zelfs over die zone zit een masker dat ervoor zorgt dat de scanner elk vakje duidelijk kan lezen. In tegenstelling tot de rest van de data is dit wel steeds dezelfde. Bij het opstellen van een QR-code is het gewoon een kwestie van uitproberen om te zien welke het beste past. Het masker dat het beste past is datgene met de laagste penaltyscore. Die score wordt berekend via de formule waarmee elk masker wordt opgesteld.

Om te weten over welk type data het nu juist gaat, leest de scanner een vierkant patroontje van vier bits, helemaal rechts beneden van de QR-code. Dat is de Mode Indicator. De belangrijkste types zijn:

  • Numeric: data die alleen uit cijfers bestaat
  • Alfanumeric: cijfers, hoofdletters, spaties en bepaalde tekens (niet alles, geen vraagteken bijvoorbeeld)
  • Byte: meest gebruikte type (kan bijna alle tekens opslaan)
  • Kanji: data die bestaat uit Japanse tekens
  • ECI: data in andere tekens dan hierboven (zoals Arabisch of Chinees)

Het is interessant om nog te vermelden dat Byte het meest populair is, omdat hiermee bijna alle tekens kunnen worden opgeslagen. Hiervoor wordt gebruik gemaakt van de ASCII-code, de meest voorkomende manier om tekst op te slaan in bytes. Kanji is dan weer een apart type, omdat de QR-code oorspronkelijk Japans is. Een QR-code kan verschillende types opslaan. Elk type begint dan steeds met die specifieke indicator van vier pixels. Bovenop de Mode Indicator komt een rechthoekig patroon waarin de bits aangeven uit hoeveel tekens de data bestaat. Dat is de Character Count Indicator. Die lengte hangt af van het datatype en van de grootte van de QR-code. Een datatype dat minder bits per teken “verbruikt” kan bijvoorbeeld meer tekens opslaan, waardoor de lengte van de Character Count Indicator wordt beïnvloed. De overgebleven plaats is voor de effectieve data en wederom eventuele error-correctie, steeds verdeeld over kolommen of rijen (naargelang het patroon) van twee vakjes breed. Bij Byte wordt de data bijvoorbeeld verdeeld over bytes van steeds acht bits, voorgesteld in rechthoeken. Op het einde van de boodschap komt er opnieuw een vierkant patroon met daarin vier bits van nul. Dit geeft de ‘end of message’ weer, het einde van je boodschap. De ruimte die dan nog overblijft, is voor de errorcorrectie.

Lezen van de data

In het begin vermeldden we al dat de data van een QR-code gerangschikt staat per twee pixels en dat er wordt gelezen van boven naar beneden en van rechts naar links. Dat begint dus in de rechter benedenhoek, gaat naar boven tot aan de formatting zone, naar links voor de volgende dubbele rij en weer naar beneden. Dit herhaalt zich tot de volledige code is gelezen. Uiteraard gebeurt dit in een extreem korte tijd. Net zoals Toyota het 28 jaar geleden nodig had bij Denso Wave.

Toepassingen

Het stond al in de inleiding: de afgelopen jaren dook de QR-code prominent op in de horeca, om fysieke menu’s te vervangen, vanwege de coronacrisis (wij missen de authenticiteit van zulke menu’s trouwens wel). Maar de toepassingen voor dit systeem zijn legio. Het heeft een lange weg afgelegd sinds het tracken van bepaalde kabeltjes of lampjes in een auto. Een QR-code kan worden gebruikt voor websites, contactgegevens, online wedstrijden en noem maar op. Wees wel voorzichtig met zomaar random QR-codes scannen; net zoals ongeveer elke uitvinding of technologische vooruitgang kan ook deze gebruikt worden door wie minder goede bedoelingen heeft…

qr-code menukaart
QR-code in plaats van fysiek menu op café.

Nieuwe types QR-codes

Voor een concept dat al 28 jaar bestaat is het natuurlijk niet vreemd dat er intussen evoluties zijn verschenen. Zo is er nu ook een QR-code die specifiek is ontwikkeld om net grafische elementen te integreren, wat van commercieel belang kan zijn. De micro-QR-code is dan weer speciaal om op kleine plaatsen te kunnen aanbrengen en toch goed leesbaar te zijn en iQR-code is in de vorm van een rechthoek, specifiek om aan te brengen op langere oppervlakten.

Schrijf je in op onze nieuwsbrief en ontvang elke week het beste van Clickx in je mailbox.