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.
Hi Raffael,
Ich scheitere leider kläglich darin Dein Project zu laden (VS2015). Welche IDE benötige ich?
Oder gibt es einen Trick den ich nicht kenne?
Danke für Hilfe
Martin
Hallo,
erstmal vielen Dank für die Bibliothek! Hat mir wirklich sehr geholfen, den SwissQrCode in meine Programme einzubauen. Nur habe ich ein Problem: wenn ich den SwissQrCode erstelle und mit meiner Handy App lese, sehe ich alle Umlaute. Die ZKB hat meinen Code aber als fehlerhaft eingestuft, da keine Umlaute gelesen werden können. Ich weiß jetzt nicht, welchen Scanner die ZKB verwendet, aber gibt es eine Möglichkeit, den Code fix mit UTF-8 auszugeben? Denn ich denke, dass die ZKB nur UTF-8 Codes akzeptiert.
Vielen Dank und viele Grüße
Christian
Hallo Christian
Habe das gleiche Problem.
Hast du es hinbekommen, dass in UTF-8 codiert wird?
Danke im Voraus für eine kurze Rückmeldung
Gruss Thomas
Super Bibliothek!
Schade gibt es diese nicht auch für Matrix Codes (als Free).
Oder habe ich da etwas übersehen?
Tolle einfache Umsetzung. Habe es für unseren Sportverein und als Teaser für eine Firma verwendet, um zu zeigen was machbar wäre. Eine Organisation und Funktion kann man für eine VCard nicht hinzufügen?
Hallo,
vielen Dank dafür, ich werde dies einmal Testen und ggf. in meine Anwendung mit einbringen…
Kann man immer gut gebrauchen…
Hi Raffi
Ich habe dein Projekt für die Darstellung von QR-Codes einmal herunter geladen und bin nun am testen.
Ich würde sehr gerne den Code in Access benutzen.
Ich konnte vorerst das Implementieren der TLB-Datei in Access. Ich sehe dort auch die Bibliotheken für QR-Code.
Jedoch ist mir nicht klar wie ich nun das Ganze in ein Formular bringe und den Code darstellen kann.
Kannst du hier einmal ein kurzes Beispiel geben?
Vielen Dank.
Gruss Peter
Hallo Peter,
kurz gesagt – ohne Umbauten kannst du den QRCoder nicht in VBA-Projekten verwenden. Damit dies gelingt, muss du:
– Den Projekt-Typ auf COM “umbauen”
– Die DLL in Visual Studio “COM-Visible” machen
– Im QRCoder ein “COM-Interface” implementieren, da die Methoden durch ihre vorbelegten Parameter nicht VBA-tauglich sind
– Die DLL (idealerweise + TLB) per RegASM am System registrieren
Das ist alles machbar, jedoch mit etwas Aufwand verbunden. Wenn du Unterstützung brauchst, kann ich dir da was im Auftrag programmieren.
Gruß,
Raffael
Hallo Raffi
Es geht in diesem Fall nur noch um ein Com-Interface zu implementieren.
Der Rest klappt und ist klar.
Habe noch nie ein Com-Interface in Visual Studio implementiert. Muss mich zuerst mal rein arbeiten und schauen wie das geht.
Danke auf jeden Fall für die Rückmeldung.
Gruss Peter
Hallo Peter,
Part 1 dieses Artikels: https://www.codeproject.com/Articles/7859/Building-COM-Objects-in-C
beschreibt die Grundlagen von COM-Interfaces in C#. Ansonsten lass mir eine Mail zukommen.
Hi Raffi
Der QRCoder hat mir gerade einiges an Zeit bei meiner Arbeit gespart. Danke dir vielmals dafür!
Gruss Simon
Hallo Raffi
Dein Coder erstellt QR Codes nach ISO/IEC 18004:2006
Was muss ich tun, um QR Codes nach jis x 0510/2004 zu erstellen?
Hallo Charly,
ich will ehrlich sein – den JIS X0510/2004 habe ich nicht gelesen und kenne ihn daher nicht. Weicht er stark vom ISO 18004 ab?
Hilf mir zu verstehen, wo dein Problem ist. Sind ISO 18004 nicht zu JIS kompatibel? Und woher kommt die Anforderung, dass deine QR-Codes JIS-konform sein sollen?
Wenn du mir eine englischsprachige Variante des JIS besorgen kannst, würde ich mal drüber schauen.
Gruß,
Raffael
Hallo Raffi
Ich möchte QRCode in MS-Access (2010 und/oder 2013) einsetzen. Mir ist es aber nicht gelungen, die QRCoder.dll einzubinden. Die Meldung in Access lautet: “Verweis auf angegebene Datei kann nicht hinzugefügt werden.” Ich versuchte auch die DLL mit verschienden Attributen neu zu kompilieren. Nur Fehlschläge! Ist Ihnen eine Weg bekannt, die QRCoder.dll in Access eizubinden? Ich verwende mehrere DLL’s in Access, die einwandfrei laufen. Aber jene sind in C programmiert und mit älteren Compiler erzeugt. Übrigens: Ich verwende Visual Studio 2015 für den QRCoder.
Gruss Gotthard
Du musst die DLL COM-Visible machen. Schau dir mal diesen Artikel an: http://www.geeksengine.com/article/create-dll.html
Guten Abend :)
Ich habe mich gerade erst in QR-Codes eingearbeitet. Um den QR-Coder in VB.Net einzubinden habe ich nicht mal 10 Minuten gebraucht und schon das erste Ergebnis gehabt.
Microsoft sollte den QRCoder genau so ins Framework übernehmen ;)
Vielen Dank für deine gute Bibliothek!!
LG Stefan
Hallo,
danke für die tolle Bibliothek, ich nutze diese übrigens seit 2014 um einer Software die noch auf VB 6 basiert QR Codes beizubringen. (per Win32 DLL C++/Clr, .netmodule) und habe mir heute mal die aktuelle Version geholt, da die alte (von 2014) doch immer wieder mal fehlerhafte QRCodes produzierte (bei bestimmten Texten/ECC Level wurde z.b. aus einen “s” ein “c”)
Ein Hinweis, dass die aktuelle Version sich nicht mehr mit VS unter Version 2015 compilieren lässt (obwohl eigendlich nur VS 2010 nötig wäre), ist vielleicht noch eine Idee ^^
Hallo,
erstmal vielen Dank für deine Arbeit. Ich habe wohl aber ein Problem gefunden, wenn ich Text mit Umlauten generieren lasse wird daraus ISO-8859-1 und die Sonderzeichen werden falsch dargestellt, wenn ich ihn in UTF-8 zwinge lässt sich der QR-Code nicht mehr scannen …
Hast du vllt. eine Idee?
MfG,
Marcel
Hallo Marcel,
dann wollen wir mal… Solange alle Zeichen in deiner Payload ISO-8859-1 konform sind, codiert der QRCoder diese auch in ISO-8859-1. Dies ist vom QR-Code-Standard (ISO/IEC
18004) auch so vorgesehen. Lediglich, wenn in der Payload Zeichen sind, die nicht in ISO-8859-1 codiert werden können, verwende ich im QRCoder UTF-8.
Per Standard sollte ein QRCode-Reader aber ISO-8859-1 interpretieren und kann zudem noch UTF-8 interpretieren. In Fällen wo ich also UTF-8 codiere, kann es sein, dass ein QR-Reader aussteigt, weil er sich an die ISO-Norm hält und nur ISO-8859-1 kann. Ich habe mich jedoch entschieden in solchen Fällen UTF-8 zu nehmen, da dann immerhin die Chance besteht, dass der Reader es lesen kann. Lieber nur jeder zweite Reader, der in diesen Sonderfällen damit klarkommt, als dass der Code bei niemandem klappt, weil ich die nicht ISO-8859-1 konformen Zeichen nicht codieren konnte. Soviel zur Erklärung, warum der QR-Coder codiert, wie er codiert.
Ich habe eben einmal mit der aktuellen Version von Github folgende Payload encodiert: “1234567890ÄÖÜäöü”. Der QRCoder hat ISO-8859-1 encodiert. Das ist korrekt. Mein QR-Reader (https://play.google.com/store/apps/details?id=com.google.zxing.client.android&hl=de) kann den Code ebenfalls korrekt lesen, weshalb ich dein Problem gerade schwer nachvollziehen kann.
Ich habe folgende Vermutung:
-> Der Reader, den du verwendest, ist nicht getreu der ISO-18004 entwickelt und erwartet immer UTF-8 codierte Strings. Deshalb interpretiert er meinen ISO-8859-1 String falsch.
—> Lösungsansatz: Probiere mal einen ZXing basierten Reader wie z.B. den hier im Kommentar verlinkten aus.
Sollte es dennoch nicht klappen, lasse mir bitte folgende Informationen zukommen:
– Wie lautet die genaue Zeichenkette, die du als QR-Code codieren willst?
– Welches Error-Correction-Level (L,M,Q,H) nutzt du?
– Welchen QR-Code-Reader nutzt du zum überprüfen des Codes?
Viele Grüße,
Raffael
Super gut! Schön erklärt, simple und sogar mit Image im QR Code! Vielen Dank fürs veröffentlichen! Kann ich gut gebrauchen ;)
Vielen Dank für’s Feedback. Sowas hört man doch immer gerne :-)
Hallo,
wenn ich einen QRCode für den String
300000300000000000000000082AFE6B erstelle, dann wird im QRCode nur der Teil bis 82AFE6B berücksichtigt, sprich 82AFE6B fehlt.
Kannst du das mal prüfen bitte?
Vielen Dank!
Gruß
Manuel
Hallo Manuel,
bist du sicher, dass du die aktuellste Code-Version aus Github hast? Ich konnte den Fehler (unabhängig vom ECC-Level) nicht reproduzieren. Siehe hier: https://abload.de/img/qrcode0xq2v.png
Für den Test hatte ich den QR-Code-Reader von hier ( http://www.codetwo.de/freeware/qr-code-desktop-reader/ ) genutzt.
Da ich bei der Implementierung des QRCoders standardkonform (nach DIN/ISO) vorgegangen bin und der besagte Reader den QR-Code lesen kann, kann ich mir nur 2 Fehlerquellen vorstellen.
Entweder dein Reader kommt mit dem QR-Code nicht klar (vielleicht weil aus Performancegründen nicht Standard-konform implementiert wurde) oder der QRCode wird korrekt gelesen und an nachfolgender Stelle in deinem Code geht ein Teil des Payload verloren.
Hi,
das ist echt eigenartig, verwende ich den Desktop Reader von CodeTwo, bekomme ich auch ein korrektes Ergebnis. Verwende ich irgendeinen anderen (z.B. von ZXing), dann werden die Zeichen hinten nicht mit dekodiert.
Setze ich den ECC Level von H auf M klappt es sofort.
Hast du ne Idee?
Gruß
Manuel
Hallo Manuel,
da hatte sich doch noch ein Bug in der ECC-Berechnung eingeschlichen. Zudem habe ich die Mask-Pattern-Logik etwas verbessert. Mit dem aktuellen Release/Code-Stand von Github dürfte der Fehler nicht mehr auftreten bzw. der Code auch in Level H auf allen Reader lesbar sein.
Hallo,
setzte den Coder auch schon eine Weile ein und lief bisher auch echt super.
Nun muss ich Codes mit dem Ø-Zeichen erstellen. Eigentlich geht das auch, aber nicht wenn es hintereinander vorkommt, z.B. 99ØØ12345.
Könnte das mal überprüft werden?
Vielen Dank und Gruß
Tom
Ich schaue morgen mal im Debugger drüber. ;-)
Hallo Tom,
ich habe am Wochenende mal dein Problem angeschaut. Mit der letzten Version aus dem Github-Repository und folgendem QR-Reader (http://www.codetwo.de/freeware/qr-code-desktop-reader/) konnte ich deinen Fehler nicht reproduzieren.
Egal, ob Level L, M, Q oder H – der QR-Code hatte immer die vollständige Nachricht. Welchen Reader nutzt du denn? Vielleicht kommt der mit den Sonderzeichen nicht klar.
Hallo Raffi,
du hast Recht, es funktioniert. Scheint wirklich an den Readern zu liegen.
Habe nun schon einige Smartphone Apps getestet und nur eines gefunden das funktioniert: NeoReader.
Warum haben die meisten Apps ein Problem? Zum Verrückt werden das.
Danke für Deine Mühe.
Gruß
Tom
Hallo Tom,
ich muss etwas zurückrudern. Ja, in einigen Readern gehen meine QRCodes. Vermutlich wegen toleranterer Programmierung. Alles in allem scheint da dennoch irgendwo ein Fehler zu sein. Soweit ich es eingrenzen konnte, muss es bei der Berechnung der ECC (Error Correction Codewords) passieren.
Der Reader hier gibt etwas “Debug-Output”: http://qrlogo.kaarposoft.dk/qrdecode.html Für eine 100% Fehleranalyse reicht das jedoch nicht. Dementsprechend muss ich wohl noch mal Step by Step mit dem Debugger die Ergebnisse gegen die ISO Norm vergleichen oder eine andere QRCode Library ziehen und diese Parallel debuggen und schauen, wo es schief läuft.
Das wird jedoch wieder extrem zeitintensiv und da ich derzeit mega ausgelastet bin, kann es noch ein paar Tage dauern.
Da der Code jedoch auf Github ist, ist hiermit jeder herzlich eingeladen selber den Debugger anzuwerfen und zu schauen, wo es schief läuft.
Hallo Tom,
in der aktuellen Version auf Github (oben im Artikel verlinkt), sollte der Fehler nicht mehr auftreten. Gerne einmal testen und mir ein kurzes Feedback geben.
Gruß,
Raffael
Hallo,
auch ich danke für die tolle Arbeit. Läuft reibungslos bei mir, habe den Code in einen COM Callable Wrapper gepackt und nutze ihn nun in unserem Microsoft Dynamics NAV, um aus diesem direkt in Reports QR Codes (mit überlagerndem Logo) zu generieren und zu drucken.
Läuft perfekt! Vielen Dank!
Gruß
Manuel
Hallo Raffi
Vielen vielen Dank für deine tolle Arbeit.
Ich hab den QRCoder in eine c# Registrierkassensoftware eingebaut.
http://www.die-kassa.at
Es war dann noch genug Arbeit, das für die unterschiedlichen Bondrucker zu implementieren.
Aber ohne deine Files, wär’s wahnsinn gewesen
Ich spende dir auch gerne ein paar Biere :)
Hallo,
erstmal, vielen Dank für den Quellcode.
Ich glaube in QRCodeGenerator.cs (Zeile 579) gab es einen Fehler und zwar es muss [x][y] anstelle von [x][x] stehen.
Vielen Grüßen,
Ouni
Hallo Ouni,
ich kann dir leider nicht ganz folgen. Bist du sicher, dass du Zeile 579 meinst? Damit wir auf einen Nenner kommen, könntest du mir sagen, welche Zeile das in dieser Datei entspräche? https://github.com/codebude/QRCoder/blob/master/QRCoder/QRCodeGenerator.cs
Und wenn möglich, noch die Info, warum da [x][x] statt [x][y] hin muss.
Viele Grüße,
Raffael
Hallo,
Sorry, ich meine zeile 575. da steht (!qrCode.ModuleMatrix[x][x] )
Vielen Grüßen,
Joe
Krass, du hast recht. Habe den Change übernommen und im Github aktualisiert. Vielen Dank für deine Hilfe!
Wie hast du den Fehler entdeckt? Hast du ein komplettes Code-Review gemacht? Durch Zufall? Beim debuggen?
Mir ist auch nen Fehler aufgefallen. Wenn der zu codierende Code exakt 26 Zeichen lang, alphanumerisch mit kleinen Buchstaben ist und das letzte Zeichen eine 0 wird ein unlesbarer Code generiert. Ausgetestet hab ich’s mit Ecc “H”. Ich habs’ auch mal mit einer fixen Qr-Code Version versucht (statt automatisch 4; Qr-Code Version 9). Daran lag es leider nicht.
a2345678901234567890123450 –> geht nicht
a2345678901234567890123451 –> geht
A2345678901234567890123450 –> geht
a234567890123456789012340 –>geht
a23456789012345678901234560 –> geht
Ich bin super gespannt drauf, ob sich jemand darauf nen Reim machen kann ^^
Leider kann ich den Fehler nicht reproduzieren. Bei mir können alle von dir genannten Strings erfolgreich erstellt und gelesen werden. Als Scanner habe ich auf dem PC den “CodeTwo QR Code Desktop Reader” und auf dem Android-Smartphone den “Barcode Scanner” (https://play.google.com/store/apps/details?id=com.google.zxing.client.android&hl=de) genutzt.
Bist du sicher, dass du die aktuelle Codebasis verwendest? Im April diesen Jahres gab es einige Bugfixes. Sollte der Code schon länger in deinem Projekt sein und du erst jetzt den Fehler gemerkt hast, aktualisiere mal die QR-Code-Klasse. (Aktuelle gibt’s auf GitHub.)
Ansonsten könntest du noch mal einen anderen QR-Code-Reader ausprobieren. Welche App/welches Programm hast du den zum Auslesen genutzt?
Vielen Dank für die Antwort,
war jetzt eine Weile im Urlaub deshalb schreibe ich so spät.
Ich hab deinen neuen QRCode Demo Generator aus dem GIT geladen und mit Visual Studio 2013 Compeliert. Dann meinen Text “a2345678901234567890123450” als Code generiert und versucht mit deiner empfohlen App zu lesen.
Leider geht auch das nicht. Alle anderen Beispiele funktionieren.
Hier ein Bild vom Problemcode
http://www.fotos-hochladen.net/view/barcodelcz28o9x3d.png
Hier noch meine .exe
http://workupload.com/file/ASo8qSul
Hallo Karma.
was lange währt wird endlich gut. Ich habe den Bug innerhalb einer 2-tägigen Debugging-Session endlich finden können. Wenn du dir die aktuelle Version der Library ziehst, sollte der Fehler nicht mehr reproduzierbar sein.
Gruß,
Raffael
Erstmal vielen Dank für deine tolle Arbeit! Riesen Kompliment. Eine Frage / Feature request habe ich aber noch: Wäre es möglich bei der Erstellung platz in der Mitte für ein Loge frei zu halten?
Viele Grüße
Christian
Hallo Christian,
das ist nicht direkt möglich. Eine Lücke in der Mitte schließt der QR-Code Standard bzw. die entsprechende ISO aus. Hierzu müsste man einen komplett eigenen Standard/Code entwerfen.
Falls du jetzt mit einem – “Aber das habe ich schon bei anderer Leute QR-Codes gesehen […]” – kommst, lass mich dir folgendes sagen. Wenn du ein Logo auf einem QR-Code haben willst, erzeuge den QR-Code und setze entweder direkt in deinem Programmcode oder später mittels eines Bildbearbeitungsprogramms ein Logo auf den Code. Ein QR-Code enthält eine eingebaute Fehlerkorrektur, sodass auch bei Verlust von Informationen (zum Beispiel durch Überdeckung durch ein Logo) die Nachricht ausgelesen werden kann. Die Qualität der Fehlerkorrektur kannst du mit ECCLevel Parameter angeben. Wobei L, M, Q, H die Stufen der Fehlerkorrektur sind. H ist dabei die beste Stufe und kann bis zu 30% Verlust des QR-Codes verkraften.
Wenn du also ein Logo auf einen QR-Code setzen willst, erzeuge den QR-Code mit ECCLevel H, setze ein Logo auf den Code, das nicht mehr als 30% des Codes verdeckt und prüfe abschließend mit einem QR-Code Reader ob dein Code noch lesbar ist. Klappt es, dann ist alles gut. Wenn nicht, verkleinere das Logo bzw. verschiebe es und versuche erneut den Code auszulesen.
Geht super, danke für die tolle Arbeit!
Hallo zusammen,
wo kann ich die QRCoder.dll herunterladen. Ich krieg jetzt nämlich immer ne OverflowException bei der Variablen “gfItem” Hängt das damit zusammen?
Gruß Henrik und danke
Dein, das dürfte damit nichts zu tun haben.
Du kannst dir bei GitHub das ganze Projekt samt Beispiel herunterladen und dann nach deinen Wünschen anpassen. Projekt öffnen und mit z.b. VisualStudio kompilieren, schon hast du deine Dll.
https://github.com/codebude/QRCoder
Ich glaub ich hab noch was entdeckt.
Versucht mal bitte folgenden String in einen QR Code umzuwandeln:
https://www.youtube.com/watch?v=etKCHLgW_o0
Bei mir kommt als Ergebnis, nach dem scannen mit dem Handy das heraus:
https://www.youtube.com/gatch?v=etKCHLgW_o0
Also anstelle vom ?watch ein ?gatch.
Ich hab einen online QRCode Generator ebenfalls ausprobiert, dort funktionierts wie geplant.
Scheint irgendwie mit den Qualitätsstufen zusammenzuhängen.
L und Q liefern falsche/unterschiedliche. M und H funktionieren so wie sie sollen.
mfg.
Alfred
Kann ich bestätigen, bei sehr langen Strings finden sich in allen Qualitätsstufen hier und da kleine Fehler.
Kann ich auch so bestätigen.
Habe in allen ECC Level, Probleme mit verschiedenen Strings!
Kann man das irgendwie abfangen? Oder wird das noch gefixt?
LG
Jeff
Sieht nicht so aus. Seit ich den Bug geposted habe, ist nichts mehr passiert.
Hallo Alfred,
Der Blog sowie auch die Projekte inkl. der QR-Code Library sind mein Hobby. Da ich dual Studiere bleibt neben 40h/Woche Büro + den zusätzlichen Vorlesungen mehrmals pro Woche nach dem Büro nur wenig Zeit. Nur weil ich das noch nicht gefixt hab, heißt es nicht, dass dies nicht mehr geschieht. Mir fehlt nur schlicht und einfach derzeit die Zeit. Da das Projekt jedoch OpenSource ist, seid ihr herzlich eingeladen euch beim Bugfixing zu beteiligen. Ich freue mich über jedes Merque Request auf Github.
Konnte jemand den Fehler beheben, wenn der String etwas länger ist? Aber wie der youtube-link zeigt, hab’ ich leider auch bei kürzeren Strings einen Dekodierungsfehler :/
Beste Grüsse,
Sven
Der Fehler liegt in der Funktion CalculateECCWords. Einfach den geposteten Teil ersetzen. Bei mir hat es danach mit beliebigen Kombinationen geklappt.
var leadTermSource = messagePolynom;
for (int i = 0; i < messagePolynom.PolyItems.Count; i++)
{
if (leadTermSource.PolyItems[0].Coefficient == 0)
{ // First coefficient is already 0, simply remove it and continue
leadTermSource.PolyItems.RemoveAt(0);
}
else
{
var resPoly = MultiplyGeneratorPolynomByLeadterm(generatorPolynom, ConvertToAlphaNotation(leadTermSource).PolyItems[0], i);
resPoly = ConvertToDecNotation(resPoly);
resPoly = XORPolynoms(leadTermSource, resPoly);
leadTermSource = resPoly;
}
}
Beste Grüße,
Klaus
Vielen, vielen Dank, Klaus! Ich war zwischendurch schon kurz vorm Verzweifeln, aber diesen einen Punkt hatte ich in meinen Papers (die als Grundlage für den QRCoder dienten) nicht gefunden…
Ich hab deinen Vorschlag getestet und in die aktuelle Code-Basis übernommen. Danke noch mal!
Ausgezeichnet!
Herzlichen Dank.
Werd ich gleich mal ausprobieren!
Ich hab da ein kleines Problem. Wenn ich mit .NET Framework 4 arbeite, funktioniert alles einwandfrei. Sobald ich jedoch .NET Framework 3.5 verwende, bekomme ich nur noch Müll. Woran liegt das?
Hat sich erledigt.
Ursache war der Linq Query in der Funktion BinaryStringToBitBlockList.
Kurz umgeschrieben, und schon funktioniert wierder alles!
Hallo Alfred,
schön, dass du das Problem schon lösen konntest. Würdest du deine Lösung auf Github per Pull Request für meinen Code zur Verfügung stellen?
Oder mir alternativ auch einfach nur die entsprechende Änderung hier als Kommentar posten? Ich würde deinen Fix gerne in den bestehenden Code übernehmen.
Viele Grüße,
Raffael
Die Neue Funktion ist nahezu identisch aber eben leicht abgeändert:
private List BinaryStringToBitBlockList(string bitString)
{
return bitString.ToList().Select((x, i) => new { Index = i, Value = x })
.GroupBy(x => x.Index / 8)
.Select(x => String.Join(“”, x.Select(v => v.Value.ToString()).ToArray()))
.ToList();
}
Vielen Dank, wenn du nichts dagegen hast, dann pflege ich das die Tage in das Github Repository ein.
Gern. Ist übrigens eine interessante Methode um einen String in 8er Blöcke zu teilen. Ich wäre nie drauf gekommen das mittels LINQ zu tun.
Toller Beitrag, wusste bis gerade nicht wie der QRC-Code funktioniert. Jetzt bin ich schon viel schlauer :-)
Cool, so was finde ich immer extrem interessant.
Das werde ich mir mal bei Gelegenheit genauer anschauen. Danke!
Danke für das Lob. Wenn du ernsthaft vor hast, dich durch den Code zu hangeln, dann mach dir parallel den ersten Link aus dem Artikel auf. (Thonky’s QR Tutorial)
Mein Code orientiert sich zu großen Teilen an der dort beschriebenen Vorgehensweise.
Viele Grüße,
Raffi