Barcode-Scanner


Image by OpenClipart-Vectors from Pixabay

Barcodes sind im Alltag, insbesondere im Einzelhandel nicht wegzudenken. In diesem Projekt, das einer Idee von von Eckart Modrow folgt, soll versucht werden, das Grundprinzip von Barcodescannern nachzubilden.

Die folgende Animation zeigt eine mögliche Umsetzung:

Im Folgenden wird die Entwicklung des Barcodescanners skizziert. Eine vollständige mögliche Lösung ist auf Anfrage erhältlich.

Notwendige Kenntnisse:

Zunächst schauen wir uns den Aufbau eines bestimmten Strichcodes, dem EAN-8-Code, etwas genauer an:

Dieser besteht aus einer Folge von schwarzen (s) und weißen (w) Balken mit vier verschiedenen Breiten. An den beiden Rändern befinden sich jeweils drei Balken mit der kleinsten vorkommenden Breite in wechselnder Folge (sws). In der Mitte des Codes finden sich fünf ebenfalls schmale Balken in der Folge wswsw. Zwischen den Rändern und dem Mittelbereich sind jeweils 16 Balken (von links: 8 weiße und 8 schwarze) unterschiedlicher Breite. Jede Breite ist jedoch ein Vielfaches der minimalen Breite der Randbalken.

Jeweils vier Balken (oben rot umrandet) im Datenbereich kodieren eine Ziffer (insgesamt: 32 Balken ≙ 4 Zeichen). Wird der Code in aufrechter Lage von links nach rechts gescannt gilt folgende Codierung für eine Ziffer.

Breite der
vier Balken swsw
codierte Ziffer
3211 0
2221 1
2122 2
1411 3
1132 4
1231 5
1114 6
1312 7
1213 8
3112 9

Dabei fällt auf, dass die vier Balken für eine Ziffer insgesamt immer eine Breite von 7 haben. Jeder Ziffer beansprucht also gleich viel Platz.

Für das Projekt sind lediglich zwei Sprites notwendig. Eines zur Darstellung des Barcodes mit einem passenden Kostüm und ein Sprite, das den Lichtpunkt des Scanners darstellt und die Skripte enthält.

Für den Scanner erzeugt man ein Kostüm, das aus einem möglichst kleinen Kreis besteht. Dies ist wichtig, weil wir später überprüfen wollen, ob dieses Sprite gerade schwarze oder weiße Bereiche berührt. Ist das Kostüm zu groß, können schmale Balken nicht sauber erfasst werden.

Zunächst bewegen wir den Scanpunkt von links nach rechts über das Zeichenfenster und speichern jeweils die x-Position in einer Liste , wenn ein Farbwechsel von weiß nach schwarz oder umgekehrt erfolgt.
Dazu nutzen wir zwei Hilfsblöcke und , die dafür sorgen, dass sich der Scanpunkt solange nach rechts bewegt, bis er wieder auf einen neuen schwarzen bzw. weißen Pixel trifft. Dies Blöcke sorgen also dafür, dass sich der Scanpunkt anschließend am linken Rand eines schwarzen bzw. weißen Balkens befindet.

Eine möglich Implementierung für :

Die Umsetzung für ist analog.

Mit einem geeigneten Skript speichert man nun die jeweiligen x-Koordinaten der linken Balkenränder in einer Liste:

Aus den Differenzen von je zwei benachbarten Positionen lassen sich die Breiten der Balken berechnen und in einer weiteren Liste abspeichern:

Die beiden letzten Balken können verworfen werden, da sie durch den rechen Bildschirmrand erzeugt werden.

Es fällt auf, dass sich die ermittelten Werte für gleich breite Balken unterscheiden können. Im Beispiel haben die schmalsten Balken eine Pixelbreite von 4,5 oder 6. Wir nutzen die ersten drei Balkenbreiten, um einen mittlere Balkenbreite für die schmalsten Balken zu berechnen:

Wir teilen wir nun alle Strichbreiten durch dies Einheitsbreite, runden auf ganze Zahlen und speichern dies Werte in einer neuen Liste . Das folgende Skript zeigt, wie man z. B. einen Datenbereich (16 einzelne Balken) zu den normierten Balkenbreiten 1-4 umrechnet.

Die jeweils drei Balken der Randbereiche und die fünf Balken in der Mitte verwerfen wir dabei, so dass nur noch 32 Balken für die beiden Datenbereiche übrigbleiben:

Im letzten Schritt rechnen wir nun jeweils eine Folge von vier dieser Zahlen mit Hilfe obiger Tabelle zu einer Ziffer um. Die ermittelten Ziffern fügen wir nacheinander als Zeichen einer Variable an.

Um das Programm zu testen erzeugt man am besten mit einem EAN8-Generator aus dem Internet einige Codes, speichert sie als Bild und fügt sie als Kostüm für ein Sprite ein. Unter Umständen muss das Bild noch etwas vergrößert werden, damit die einzelnen Balken auch sauber erkannt werden können.

Das beschriebene Programm hat den Vorteil, dass die Barcodes nicht in einer bestimmten Größe vorliegen müssen. Außerdem wird der Code auch richtig erkannt, wenn der Barcode gegenüber der Bewegungsrichtung des Scanpunktes gedreht ist.

Der EAN-8-Code kann auch gescannt werden, wenn er auf dem Kopf steht. Grund dafür ist die besondere Codierung der Ziffern als Folge von vier Balken. Mit einer kleinen Ergänzung des Programms lässt sich dies leicht umsetzen.

Maschinenlesbare grafische Codes sind im Handel, aber auch bei vielen Dienstleistungbetrieben nicht mehr wegzudenken. Grundsätzlich unterscheidet man zwischen eindimensionalen (z. B. Strichcodes auf Artikel im Supermarkt) und zweidimensionalen Codes (z. B. QR-Codes). Einige Unternehmen setzen dabei eigene zweidimensionale grafische Codes ein (z. B. die Deutsche Bahn oder große Online-Versandhändler). Am häufigsten trifft man als Privatperson auf QR-Codes (Quick-Response), die in den meisten Fällen eine Internetadresse beinhalten.

Weitere Informationen:

Beim EAN-8-Code können eigentlich nur sieben Ziffern codiert werden. Recherchiere und erkläre, welche Bedeutung die achte Ziffer hat.
Recherchiere, wie der häufig eingesetzte EAN-13-Code aufgebaut ist und welche Bedeutung die Ziffern der zugehörigen Zahl haben.
Beschreibe, welche möglichen Gefahren beim Scannen von QR-Codes bestehen und wie diesen begegnet werden kann.