QR-Codes dürfte mittlerweile so ziemlich jeder kennen. Seitdem Smartphones immer populärer werden, finden auch QR-Codes immer mehr den Einzug in unser Alltagsleben. Grund genug, um sich als interessierter Informatiker einmal näher mit der Technik dahinter zu beschäftigen. Und was liegt da näher, als selber einmal einen QR-Code-Generator zu implementieren?
Da C# die Programmiersprache ist, in der ich mich am besten zurecht finde, fiel die Wahl dementsprechend auf diese Sprache. Informationen zum QR-Code sind wiederum gar nicht so leicht zu bekommen. Am einfachsten wäre es natürlich die entsprechende ISO/IEC Norm zu Rate zu ziehen. Das wäre die ISO/IEC 18004. Mit rund 170€, die die ISO dafür haben will, ist diese mir für ein Non-Profit-Hobbyprojekt jedoch etwas zu teuer.
Wie funktionieren QR-Codes (technisch)?
Zum Glück gibt es im Netz zwei, drei wirklich gute Quellen, die die Funktionsweise eines QR-Code-Generators erklären. Mit Hilfe dieser Seiten, habe ich mich an meine eigene Implementierung gemacht. Für alle die sich in das Thema einlesen wollen, nachfolgend einmal meine Hauptquellen:
Da die komplette Logik zur Generierung doch etwas komplizierter ist und den Rahmen dieses Posts bei weitem sprengen würde, werde ich diese hier nicht weiter erläutern. Wer mag, kann sich auf den oben verlinkten Seiten einlesen und bei Fragen natürlich gerne einen Kommentar schreiben. Ich werde dann so gut es geht Rede und Antwort stehen.
Ich habe bereits einige QR-Code-Individuallösungen für Kunden verschiedener Branchen umgesetzt. Warum also nicht auch für Sie?
Nachfolgend soll es mehr um die Verwendung meiner QR-Code Library gehen. Also wie sie zu benutzen ist, wo ihr sie herbekommt und unter welcher Lizenz sie steht.
Woher bekomme ich QRCoder?
Den Quellcode des QRCoder, so habe ich meinen QR-Code Generator genannt, bekommt ihr auf GitHub. Der Code steht unter der MIT-Lizenz und kann somit also gerne in nicht-kommerziellen als auch in kommerziellen Projekten verwendet werden.
QRCoder @ Github
Solltet ihr die Library für eines eurer Projekte verwenden, würde ich mich trotzdem freuen, wenn ihr einen kurzen Kommentar hinterlassen würdet. (Man freut sich ja immer zu sehen, was aus seinen “Babys” wird.)
Wie verwende ich QRCoder?
Die Verwendung des QRCoders gestaltet sich relativ einfach. Zuerst müsst ihr natürlich eine Referenz auf die QRCoder.dll hinzufügen.
Um einen QR-Code zu erstellen und anzuzeigen reichen im Endeffekt 4 Zeilen Code aus.
private void renderQRCode() { QRCodeGenerator qrGenerator = new QRCodeGenerator(); QRCodeData qrCodeData = qrGenerator.CreateQrCode("The text which should be encoded.", QRCodeGenerator.ECCLevel.Q); QRCode qrCode = new QRCode(qrCodeData); Bitmap qrCodeImage = qrCode.GetGraphic(20); }
In der ersten Zeile wird der QR-Code Generator instanziiert, in der zweiten Zeile wird eine QR-CodeData Objekt erstellt, in der dritten Zeile wird der QR-Code-Objekt erstellet, welches in der vierten Zeile dann als Bitmap-Grafik gerendert und in einer PictureBox angezeigt. Mehr ist nicht nötig, um einen QR-Code zu erstellen und anzuzeigen.
Die passende Fehlerkorrektur
Die Funktion CreateQrCode() nimmt neben der Zeichenkette, die im QR-Code kodiert werden soll auch noch das Fehlerkorrekturlevel (ECCLevel) an. Hierbei stehen die Level L (7%), M (15%), Q (25%) und H (30%) zur Verfügung, wobei die Prozentzahl angibt, wie viel Prozent des QR-Code maximal verdeckt/zerstört sein dürfen, damit dieser trotzdem mittels der Fehlerkorrektur noch erfolgreich ausgelesen werden kann.
Kreativ sein – QR-Codes selber rendern
Wie im obigen Beispiel gezeigt, kann man mittels der GetGraphic() Funktion als Bitmap rendern lassen. Hierbei wird ein klassicher schwarz-weißer QR-Code erstellt. Wer es lieber bunt hat, oder statt viereckigen Teilblöcken Punkte haben möchte, kann sich die Eigenschaft ModuleMatrix des QR-Code Objekts zu nutze machen. Diese enthält Für jede Zeile und Spalte des QR-Codes die Information, ob der Teilblock schwarz oder weiß sein muss. Mit Hilfe diese Information kann man sich nun eine eigene Methode zum rendern schreiben.
//List<System.Collections.BitArray> ModuleMatrix foreach (System.Collections.BitArray line in qrCode.ModuleMatrix) { foreach (bool block in line) { //Platz für eure eigene Render-Funktion //Wenn block==true dann dunkel, sonst hell rendern } }
Feedback, Kritik und Pläne
Solltet ihr (konstruktives) Feedback, Anregungen, Fragen, Tipps, Sorgen oder Probleme mit der Library haben, dann schreibt mir einfach einen Kommentar. Auch über Forks auf GitHub freue ich mich immer.
Wie es mit Library weiter geht, ist noch nicht ganz klar, da mir momentan die Zeit fehlt. Ideen habe ich jedoch noch einige. So möchte ich gerne noch weitere Methoden zum Rendering einbauen, um QR-Codes noch auf andere Weisen darstellen zu können. Auch kann ich ich mir vorstellen, direkt Funktionen bereitzustellen um QR-Codes mit Inhalten eines bestimmten Formats zu erstellen, wie z.B. QR-Codes die Telefonnummern oder WLAN-Zugangsdaten enthalten. Das ist nun umgesetzt. Mittels der Klasse PayloadGenerator können auch WiFi- und andere QR-Codes erstellt werden.
Für all das brauche ich jedoch erst einmal die Zeit. Falls jemand Lust hat und sich selber dran macht, lässt sich die Library ja vielleicht auch im Team erweitern.
So weit, so gut! Ich wünsche viel Spaß mit der QRCoder Library.
Maybe in the future it’ll do even better in those areas, but for now it’s a fantastic way to organize and listen to your music and videos, and is without peer in that regard. The iPod’s strengths are its web browsing and apps.
Sehr interessanter Artikel, danke. Einen QR-Code zu programmieren ist nicht einfach
Hallo,
ich benutze die Komponente zum erstellen von Schweitzer QR Codes (SwissQrCode). Dabei übergebe ich keine zusätzlichen Informationen (AdditionalInformation). Wenn ich aber nun den erzeugten QR Code im das Validierungsportal der Postfinance testen lasse, erhalte ich folgenden Fehler:
Das Element ‘StrdBkgInf’ darf nur geliefert werden, wenn es auch befüllt ist.
Wie löse ich das Problem?
Super Sache diese Lib.
Die ganze Swiss Bill QR-Geschichte in einem komplexen Invoicegebilde innert kürzester Zeit implementiert.
Hallo Raffi
Zuerst einmal herzliche Gratulation zu Deinem QR-Coder, welche wir bereits in einem Visual Studio Projekt (vb.net Windows-Forms) einsetzen.
Wir haben noch ein älteres Visual Foxpro Projekt, in welchem wir nun ebenfalls eine QR-Rechnung ergänzen möchten. Leider können in VFP nur COM-Dll’s eingebunden werden, also die aktuelle QRCoder .dll leider nicht.
Könntest Du nicht auch noch ein COM-DLL zu QR.Coder erstellen?
– dann die DLL wirklich universell einsetzbar
– der Aufwand sollte “überschaubar” sein
Es wäre super, wenn Du das machen könntest :-)
QR coder zu programmieren ist keine einfache Sache