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: