SigSys15 Barcode erzeugen und lesen
Autor: Steffen Schulze Middendorf
Betreuer: Prof. Schneider
Motivation
Barcodes begleiten unseren Alltag bereits seid Jahrzehnten. Sie codieren Preise im Einzelhandel, ermöglichen das Verfolgen von Briefen und Paketen oder sind als Teil der Stempelkarte Teil der Zeiterfassung in der Industrie. Doch wie werden Barcodes erzeugt und gelesen? Dieser Artikel soll einen kurzen Einblick in die Notation, die Erstellung und das letzlich das Lesen des speziellen CODE39 geben.
CODE39
Der CODE39 ist in der ISO/IEC 16388[1] spezifiziert, grundsätzlich besteht dieser aus Strichen und Lücken, jeweils in schmal und in breit.Es handelt sich um einen diskrten Code, das heisst jeder Buchstabe beginnt und endet mit einem Strich. Zwischen jedem Buchstaben findet sich zur Abgrenzung eine schmale Lücke. Jeder erzeugte Strichcode beginnt und endet mit einem Sternchen(*). Man spricht hier von einem Start/Stopp-Zeichen.
In der Tabelle rechts ist der gesamte verfügbare Zeichensatz dargestellt.
In der Standart Variante verfügt der CODE39 über keine Prüfziffern. Im folgenden sollen die Vor-und Nachteile stichpunktartig dargestellt werden.
Vorteile:
- realtiv einfach herzustellen und zu lesen
- hohe Drucktoleranzen akzeptabel
Nachteile:
- geringe Code Dichte
- keine Prüfsumme
Projektplan
Vorgang | Abgeschlossen bis |
---|---|
Semsterstart | KW10 / 2015 |
Themenauswahl | KW12 / 2015 |
Informationen sammeln | KW13 / 2015 |
Erzeugen von Barcode implementieren | KW15 / 2015 |
Funktionscheck - Erzeugen | KW17 / 2015 |
Lesen von Barcode implementieren | KW16 / 2015 |
Funktionscheck - Lesen | KW17 / 2015 |
Code Optimierung und Fehlerbehebung | KW18 / 2015 |
Kommentieren und dokumentieren abschließen | KW18 / 2015 |
Wiki-Artikel finalsieren | KW20 / 2015 |
Abgabe | KW25 / 2015 |
Implementierung Barcode erstellen
function barcode_erstellen(Eingabe,schmal,breit)
%%-------------------------------------------------------------------------
% PROGRAM: barcode_erstellen(Eingabe,schmal,breit)
% VERSION: 1.01
% DATE: 2015-05-02
% DESCRIPTION: Program creates user defiend barcodes in CODE39
% notation.
%
% AUTHOR: Steffen Schulze Middendorf
%
% INPUT: Eingabe: Type in what you want to transform into CODE39
% notation. Function works exclusively with
% capital letters and numbers.
% In addition: '-';'.';' ';'$';'/';'+';'%'
% schmal: Declare thickness of slender element in pixel
% breit: Declare thickness of a wide element in pixel
% pixel
%
% Rrelation between slender and wide have to be 1:2.
%
% OUTPUT: This progamm creates a new .JPG file in the program
% folder. Content of this image is the created barcode.
% Name of this file and data content of the barcode
% are the same. Each barcode starts and ends with a '*'
% automatically.
%
% EXAMPLE: barcode_erstellen('HSHL',50,100)
%
% DISCLAIMER: This program is freeware. Use at your own risk.
% Provided without any warranty
%--------------------------------------------------------------------------
%% Informationen einlesen und leeres Bild erstellen
%Größe des Barcodes in Pixel bestimmmen aus Anzahl Zeichen + Zusatzlücken
%+2 für START STOPP Zeichen -1 FÜR Lücke zum Schluss
Laenge=(6*schmal+3*breit)*(length(Eingabe)+2)+((length(Eingabe)+1)*schmal);
%Leeres schwarzes Bild(CODE39) in benötigter Breite und Höhe erstellen,
%Standarthöhe ist zehnfache breite eines breiten Elements.
CODE39 = zeros(10*breit,Laenge,3);
%Startpunkt in x festlegen(Pixelspalte)
Startpunkt=0;
%% Startzeichen, Eingabe und Endzeichen in CODE39 notation in leeres Bild einfügen
% Insgesamt besteht jeder CODE39 barcode aus 4 verschiedenen Elementen.
% Zur Erstellung jedes dieser Elemente existiert eine Erstellungsfunktion.
% schmal_strich(Startpunkt,Bild,schmal);
% schmal_luecke(Startpunkt,Bild,schmal);
% breit_luecke(Startpunkt,Bild,breit);
% breit_strich(Startpunkt,Bild,breit);
%Startzeichen "*" einfügen
[Startpunkt,CODE39] = schmal_strich(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = breit_luecke(Startpunkt,CODE39,breit);
[Startpunkt,CODE39] = schmal_strich(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = schmal_luecke(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = breit_strich(Startpunkt,CODE39,breit);
[Startpunkt,CODE39] = schmal_luecke(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = breit_strich(Startpunkt,CODE39,breit);
[Startpunkt,CODE39] = schmal_luecke(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = schmal_strich(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = schmal_luecke(Startpunkt,CODE39,schmal);
%Jedes Zeichen beginnt mit einem Strich und endet mit einer schmalen Lücke
%Schleife durchläuft jedes einzelne Teichen der Eingabe und codiert es in
%die entsprechende Strich/Lücke Kombination. Nach CODE39 Standart.
for i=1:length(Eingabe)
if Eingabe(i) == '0'
[Startpunkt,CODE39] = schmal_strich(Startpunkt,CODE39,schmal);
%Jede Element-Erstellfunktion bekommt den bisherigen erstellten CODE
%die jeweiligen Paramter für breit und schmal sowie den Startpunkt
%für die Erstellung Ihres nächsen Elemements übergeben.
%Rückgabewerte sind der neue CODE und der neue Startpunkt.
[Startpunkt,CODE39] = schmal_luecke(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = schmal_strich(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = breit_luecke(Startpunkt,CODE39,breit);
[Startpunkt,CODE39] = breit_strich(Startpunkt,CODE39,breit);
[Startpunkt,CODE39] = schmal_luecke(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = breit_strich(Startpunkt,CODE39,breit);
[Startpunkt,CODE39] = schmal_luecke(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = schmal_strich(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = schmal_luecke(Startpunkt,CODE39,schmal);
end
if Eingabe(i) == '1'
[Startpunkt,CODE39] = breit_strich(Startpunkt,CODE39,breit);
[Startpunkt,CODE39] = schmal_luecke(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = schmal_strich(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = breit_luecke(Startpunkt,CODE39,breit);
[Startpunkt,CODE39] = schmal_strich(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = schmal_luecke(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = schmal_strich(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = schmal_luecke(Startpunkt,CODE39,schmal);
[Startpunkt,CODE39] = breit_strich(Startpunkt,CODE39,breit);
[Startpunkt,CODE39] = schmal_luecke(Startpunkt,CODE39,schmal);
end
...
Implementierung Barcode lesen
Verbesserungvorschläge
Lessons learned
Beispielbilder
Siehe auch
Weblinks
- QR Generator
- Open Source QR Code Generator
- Mobile Tagging
- YouTube: How to Decode a QR Code by Hand
- Wikipedia: QR Code
→ zurück zum Hauptartikel: Signalverarbeitende Systeme SoSe2015