Basierend auf der JavaScript3-Software von Lazar Laszlo (lazarsoft@gmail.com, www.lazarsoft.info), 2011, die wiederum auf ZXing-Autoren (Java) fußt. Diese wurde von mir auf ES6-Module modernisiert soweit es geht (wegen Code-Smell). Ca. 100 KByte JavaScript.
Vorgehensweise:
Vom Farbbild wird zunächst ein Grauwertbild generiert, wobei die RGB-Werte nicht wie üblich verrechnet werden,
sondern in etwa gleich wirksam sind.
Danach wird das Bild in 4×4 Teilbereiche aufgeteilt und jeweils Minimum und Maximum des Grauwertes berechnet.
Mit den beiden Extrema wird dann der Helligkeitsschnitt je Teilfläche ermittelt und daraus
eine Schwarzweiß-Bitmap erstellt.
Damit verringert man das Problem dunkler Ränder (Vignettierung) üblicher Objektive.
Danach erfolgt die Suche nach mindestens 3 in etwa kreisförmigen? Markern.
Anscheinend wird eine einigermaßen senkrechte Bildausrichtung erwartet.
Anhand ihrer Anordnung und Größe wird ermittelt, von welchem Typ der QR-Kode ist, d.h. wieviel Bits dieser enthält.
Entlang der Suchline zwischen den Markern befinden sich Synchronisier- und Zählabschnitte,
um genau auf die Größe des Kodes (Dimension) zu kommen:
Die Dimension lässt beim Teilen durch 4 den Rest 1.
Enthalten sind Routinen zur Koordinatentransformation, wie man am Beispiel 4 im Debug-Modus sieht.
Sinnvoller wäre es, die Bits an gedachten Suchlinien abzutasten.
Mit den Bits geht es dann in die Reed-Solomon-Fehlerkorrektur, und dann werden daraus
je nach Headerbits Ziffern, Ziffern+Buchstaben, Kanji oder UTF-8 extrahiert.
Im Debugmodus wird das Schwarzweißbild (Bitmap) in schwarz-gelb über das Foto gelegt. In der Mitte erscheint bei erfolgreicher Dekodierung die Darstellung des erkannten QR-Kodebildes 1:1 (also sehr klein) in schwarz-türkis. Eigentlich jeweils mit Alpha-Blending. Es ist immer so ausgerichtet, dass der fehlende Marker unten rechts ist. Die gefundenen Marker-Positionen werden als Fadenkreuz eingezeichnet und das Element count dazu gesetzt (da weiß ich nicht woher das kommt).
Die Beispielbilder stammen vom Wikipedia-Artikel über QR-Kode. Dieses Programm kann keine weiteren oder neueren Kodes dekodieren! Es ist dazu untersucht worden, Entfernungen zu bekannt großen QR-Kodes zu messen. Diese Information findet sich in Form von Positionsangaben für die 3 Marker in der Debug-Konsole.
Siehe auch: