Open-Source QR-Code in ASP.NET

Sonntag, 9 Januar 2011 06:52 by Christoph

Heute geht es um eine ganz andere Art der Informationsvisualisierung. Genauer: die Codierung von Information in Barcodes. Diese sind eigentlich bekannt, zum Beispiel in Form von Strichcodes auf fast allen Produktverpackungen. Strichcodes -eindimensional- sind die einfachste Form. Hier soll es um zweidimensionale Codes gehen, die in anderen Ländern schon stärker verbreitet sind und mehr Informationen fassen. In Japan ist der QR-Code (Quick-Response) bereits seit Jahren ein Renner. Im Rahmen des sog. Mobile Tagging fotografieren die Japaner alle möglichen Codes mit ihren Handys hinter denen sich Internetadressen, Mailadressen oder Kurznachrichten verbergen.

Beispiel QR-Code

Doch wie erzeugt man diese Codes? Es gibt zahlreiche SDKs. Fast alle sehr sehr kostenpflichtig. Die günstigen ab 1700 Euro, der Schnitt bei 2500 Euro. Wir wollen es aber kostenlos haben ganz nach dem deutschen Motto Geil ist Geil (Häh? Sic!). Für C++ stößt man da auf die Zint-Bibliothek unter der GNU GPL. Diese kann alle möglichen Arten von Barcodes generieren, unter andem auch den begehrten QR-Code. Also auf gehts mit der ASP.NET Integration!

Zint ist in nativem C geschrieben, es wird also eine Brücke in die .NET-Welt benötigt. Diese wird in C++/CLI gebaut. Doch von Anfang an: Im Zint-Package enthalten ist eine Visual Studio Solution mit einer Konfiguration für den Bau ein statischen Bibliothek (lib). Diese ist auszuwählen und im Release-Modus zu erstellen. Ein neues C++/CLI Projekt referenziert diese Bibliothek und wrappt die Grundfunktionen für den Managed Sprachen wie C# und Visual Basic.NET. Das sieht im Detail dann auszugsweise so aus:

public ref class BarcodeFactory
{
private:
    array<bool>^ m_data;

public:
    BarcodeFactory();
    int Encode(String^ data, int type);
    bool GetAt(int x, int y);
};

Die zu codierenden Daten werden als (managed) String an die Methode Encode übergeben. Der Parameter type enthält die Kennung des zu erzeugenden Strichcodes und wird unverändert an Zint weitergegeben. Für den QR-Code ist 58 anzugeben. Nach dem Aufruf ist das Array m_data mit Flags belegt, ob bestimmte Pixel gesetzt sind oder nicht - damit lässt sich der Code dann zeichnen.

Die entstandene Mixed-Mode-Assembly kann in ASP.NET referenziert werden. Auf diesem Server übernimmt das ein Handler (ashx), der über den Querystring gesteuert wird und eine PNG-Grafik des Codes ausliefert. Es gibt nur 2 Get-Parameter und nur der erste davon ist obligatorisch.

  1. q zu codierende Daten (Achtung: Url-Encoded!)
  2. s Skalierung der Pixel, Standard ist 4, d.h. ein Pixel im Barcode wird als ein 4x4 großes Quadrat gezeichnet

Hier ein paar Beispiele für den Aufruf des Handlers:

  1. https://christoph.stoepel.net/services/Barcode.ashx?q=Hallo+Welt (Hallo Welt mit Standard Einstellungen)
  2. https://christoph.stoepel.net/services/Barcode.ashx?q=Hallo+Welt&s=6 (Hallo Welt mit 6x6 großen Quadraten
  3. https://christoph.stoepel.net/services/Barcode.ashx?q=Hallo+Welt&s=2 (Hallo Welt etwas verkleinert)
  4. https://christoph.stoepel.net/services/Barcode.ashx?q=http%3A%2F%2Fchristoph.stoepel.net%2F (die URL dieser Seite)

Achso, bezüglich der GNU GPL des Zint-Projektes: der Download des GPL-infizierten Quelltexts ist in obigem QR-Code codiert :)