Beispiel: Kostenloser QR Code Generator
Hier ein kostenloser QR Code Generator, welcher in ASP.NET mit C# als Backend realisiert wurde:
https://www.my-asp-experiments.com/QRCode
Beschreibung
QRCoder ermöglicht das Erstellen von QR-Codes mit einer einfachen Bibliothek. Solange keine QR-Code-Version angegeben wird, passt sich die Größe der generierten QR-Codes an den zu codierenden Text an.
Die folgenden Parameter werden unterstützt:
- ECC Level: Fehlerkorrekturlevel. Gibt an wieviel Redundanzen eingebaut werden um im Fehlerfalle trotzdem lesbare Q- Codes zu erhalten. Je höher der Level ist, desto weniger Text kann im QR-Code einer bestimmten Größe gespeichert werden. Es gibt 4 ECC-Level={L, M, Q, H}, die in der folgenden ENUM definiert sind:
QRCodeGenerator.ECCLevel - Version (optional): Die QR-Code-Version legt eine feste Größe (Modulanzahl) für den generierten QR Code fest. Die QR-Code-Größe definiert sich durch die Anzahl der „Module“ in der Matrix. Ein „Module“ definiert ein Quadrat im QR-Code. Wird keine Version angegeben, vergrößert sich der QR-Code automatisch auf die entsprechende Version.
Beispiele: Version 1 hat eine Größe von 21×21 Modulen, also 1(21×21), Version 2(25×25), 3(29×29), 4(33×33), 5(37×37), 6(41×41), 7(45×45), 8(49×49), 9(53×53), 10(57×57), 11(61×61) … - Pixel pro Modul: Die Anzahl der verwendeten Pixel für die Darstellung eines Moduls im QR-Code. Da Module im QR-Code quadratisch sind, gilt der Parameter für Breite und Höhe. Durch die exakte Festlegung der Pixel kann verhindert werden, dass der QR-Code wegen einer Skalierung unscharf oder verschwommen wird (wg. Aliasing).
- Text (bzw. Textformat des zu codierenden Textes): Ein codierter Text kann numerische, alphanumerische, binäre oder Kanji-Zeichen enthalten. Die Reihenfolge dieser möglichen Zeichensätze legt von links nach rechts fest, wieviel Text insgesamt im QR-Code enthalten sein kann. Rein numerische Zeichen benötigen wenig Platz im QR-Code, wodurch für eine festgelegte Größe (Version) z.B. viel mehr Text codiert werden kann. Wenn ein Text aber nur ein einziges Kanji-Zeichen beinhaltet, wird der gesamte Textinhalt für Kanji codiert, was dazu führt dass weniger Text für eine Version (festgelegte Anzahl von Modulen) codiert werden kann.
Die folgende Tabelle verdeutlicht anhand der oben genannten Parameter, welche Datenkapazität (Textlänge) nach Version, ECC Level und verwendetem Zeichensatz erwartet werden kann:
Version (Modulzahl) | Numerisch | Alphanumerisch | Binär | Kanji | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
L | M | Q | H | L | M | Q | H | L | M | Q | H | L | M | Q | H | |
1(21) | 41 | 34 | 27 | 17 | 25 | 20 | 16 | 10 | 17 | 14 | 11 | 7 | 10 | 8 | 7 | 4 |
2(25) | 77 | 63 | 48 | 34 | 47 | 38 | 29 | 20 | 32 | 26 | 20 | 14 | 20 | 16 | 12 | 8 |
3(29) | 127 | 101 | 77 | 58 | 77 | 61 | 47 | 35 | 53 | 42 | 32 | 24 | 32 | 26 | 20 | 15 |
4(33) | 187 | 149 | 111 | 82 | 114 | 90 | 67 | 50 | 78 | 62 | 46 | 34 | 48 | 38 | 28 | 21 |
5(37) | 255 | 202 | 144 | 106 | 154 | 122 | 87 | 64 | 106 | 84 | 60 | 44 | 65 | 52 | 37 | 27 |
6(41) | 322 | 255 | 178 | 139 | 195 | 154 | 108 | 84 | 134 | 106 | 74 | 58 | 82 | 65 | 45 | 36 |
7(45) | 370 | 293 | 207 | 154 | 224 | 178 | 125 | 93 | 154 | 122 | 86 | 64 | 95 | 75 | 53 | 39 |
8(49) | 461 | 365 | 259 | 202 | 279 | 221 | 157 | 122 | 192 | 152 | 108 | 84 | 118 | 93 | 66 | 52 |
9(53) | 552 | 432 | 312 | 235 | 335 | 262 | 189 | 143 | 230 | 180 | 130 | 98 | 141 | 111 | 80 | 60 |
10(57) | 652 | 513 | 364 | 288 | 395 | 311 | 221 | 174 | 271 | 213 | 151 | 119 | 167 | 131 | 93 | 74 |
11(61) | 772 | 604 | 427 | 331 | 468 | 366 | 259 | 200 | 321 | 251 | 177 | 137 | 198 | 155 | 109 | 85 |
12(65) | 883 | 691 | 489 | 374 | 535 | 419 | 296 | 227 | 367 | 287 | 203 | 155 | 226 | 177 | 125 | 96 |
13(69) | 1022 | 796 | 580 | 427 | 619 | 483 | 352 | 259 | 425 | 331 | 241 | 177 | 262 | 204 | 149 | 109 |
14(73) | 1101 | 871 | 621 | 468 | 667 | 528 | 376 | 283 | 458 | 362 | 258 | 194 | 282 | 223 | 159 | 120 |
15(77) | 1250 | 991 | 703 | 530 | 758 | 600 | 426 | 321 | 520 | 412 | 292 | 220 | 320 | 254 | 180 | 136 |
16(81) | 1408 | 1082 | 775 | 602 | 854 | 656 | 470 | 365 | 586 | 450 | 322 | 250 | 361 | 277 | 198 | 154 |
17(85) | 1548 | 1212 | 876 | 674 | 938 | 734 | 531 | 408 | 644 | 504 | 364 | 280 | 397 | 310 | 224 | 173 |
18(89) | 1725 | 1346 | 948 | 746 | 1046 | 816 | 574 | 452 | 718 | 560 | 394 | 310 | 442 | 345 | 243 | 191 |
19(93) | 1903 | 1500 | 1063 | 813 | 1153 | 909 | 644 | 493 | 792 | 624 | 442 | 338 | 488 | 384 | 272 | 208 |
20(97) | 2061 | 1600 | 1159 | 919 | 1249 | 970 | 702 | 557 | 858 | 666 | 482 | 382 | 528 | 410 | 297 | 235 |
21(101) | 2232 | 1708 | 1224 | 969 | 1352 | 1035 | 742 | 587 | 929 | 711 | 509 | 403 | 572 | 438 | 314 | 248 |
22(105) | 2409 | 1872 | 1358 | 1056 | 1460 | 1134 | 823 | 640 | 1003 | 779 | 565 | 439 | 618 | 480 | 348 | 270 |
Installation von QRCoder.dll
Die Bibliothek „QRCoder“ kann über die gängigen Quellen bezogen werden und muss dann ggfs. als Verweis hinzugefügt werden:
Einige der genannten Quellen tun dies allerdings automatisch
GitHub
https://github.com/codebude/QRCoder
.NET CLI
dotnet add package QRCoder --version 1.4.3
Package Manager
NuGet\Install-Package QRCoder -Version 1.4.3
Package Reference
<PackageReference Include="QRCoder" Version="1.4.3" />
Paket CLI
paket add QRCoder --version 1.4.3
Script & Interactive
#r "nuget: QRCoder, 1.4.3"
Cake
// Install QRCoder as a Cake Addin
#addin nuget:?package=QRCoder&version=1.4.3
// Install QRCoder as a Cake Tool
#tool nuget:?package=QRCoder&version=1.4.3
C# Konsolenanwendung
Die folgende C# Konsolenanwendung erzeugt drei QR-Codes der Version 5 (also 37×37 Module) mit dem Fehlerkorrekturlevel L (niedrigster Korrekturlevel für viel Platz) und 4×4 Pixel pro Modul. Der Text ist binär, da er die Sonderzeichen einer URL aber keine Kanji-Zeichen beinhaltet. Der erste QR-Code beinhaltet nur den Text „d“ und wird deswegen als alphanumerisch klassifziert.
Außerdem wird der „Ruhebereich“ des QR-Codes (weißer Rand) abgeschnitten, was nicht immer zu empfehlen ist, da diese Trennung für einen korrekten Scan benötigt wird.
using QRCoder;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QRCodeTestConsole
{
public class Program
{
public static Program prg;
public const int version5QRCodeSize = 148 + 32;
public const int pixelPerModule = 4;
public const int moduleVersion = 5;
public const int croppedBorderPixels = 16;
public const QRCodeGenerator.ECCLevel eccLevel = QRCodeGenerator.ECCLevel.L;
public Program()
{
string[] content = { "d",
"https://www.youtube.com/playlist?list=PLA4OWG_-fY-JLoj-bHIPiUU1SJquB9X8J",
"https://www.youtube.com/playlist?list=PLA4OWG_-fY-JLoj-bHIPiUU1SJquB9X8J----------------------...........oipipoiopiopipoipiooipo"};
for (int i = 0; i < content.Length; i++)
{
string current = content[i];
string msgResult = this.GenerateQRCode(current, "QRCode" + i + ".bmp");
if (!msgResult.ToLower().Equals("ok"))
{
Console.WriteLine(msgResult);
}
}
Console.ReadLine();
}
public string GenerateQRCode(string content, string fileName)
{
try
{
QRCodeGenerator qrGenerator = new QRCodeGenerator();
QRCodeData qrCodeData = qrGenerator.CreateQrCode(content, eccLevel, false, false, QRCodeGenerator.EciMode.Default, moduleVersion);
QRCode qrCode = new QRCode(qrCodeData);
Bitmap qrCodeImage = new Bitmap(qrCode.GetGraphic(pixelPerModule));
// Ruhezone abschneiden - falls nicht
// gewünscht bei qrCodeImage.Save aufrufen
Bitmap croppedBmp = qrCodeImage.Clone(new Rectangle(croppedBorderPixels, croppedBorderPixels, qrCodeImage.Width - 2 * croppedBorderPixels, qrCodeImage.Height - 2 * croppedBorderPixels), qrCodeImage.PixelFormat);
croppedBmp.Save("CROP_" + fileName);
}
catch (Exception e)
{
return e.ToString();
}
return "ok";
}
public static void Main(string[] args)
{
prg = new Program();
}
}
}