Meziantou.Framework.QRCode
2.0.4
Prefix Reserved
dotnet add package Meziantou.Framework.QRCode --version 2.0.4
NuGet\Install-Package Meziantou.Framework.QRCode -Version 2.0.4
<PackageReference Include="Meziantou.Framework.QRCode" Version="2.0.4" />
<PackageVersion Include="Meziantou.Framework.QRCode" Version="2.0.4" />
<PackageReference Include="Meziantou.Framework.QRCode" />
paket add Meziantou.Framework.QRCode --version 2.0.4
#r "nuget: Meziantou.Framework.QRCode, 2.0.4"
#:package Meziantou.Framework.QRCode@2.0.4
#addin nuget:?package=Meziantou.Framework.QRCode&version=2.0.4
#tool nuget:?package=Meziantou.Framework.QRCode&version=2.0.4
Meziantou.Framework.QRCode
QR and barcode generation library with SVG and PNG renderers, plus a console renderer for QR codes. Implements QR code specifications from scratch with support for standard QR, Micro QR, and Rectangular Micro QR (rMQR) codes, and supports Code 39 / Code 128 linear barcodes.
Supported QR Code Types
| Type | Method | Sizes | Description |
|---|---|---|---|
| Standard QR | QRCode.Create(...) |
21x21 to 177x177 | ISO/IEC 18004, versions 1-40 |
| Micro QR | QRCode.CreateMicroQR(...) |
11x11 to 17x17 | ISO/IEC 18004, versions M1-M4 |
| rMQR | QRCode.CreateRMQR(...) |
Rectangular (width > height) | ISO/IEC 23941 |
Supported Barcode Types
| Type | Method | Description |
|---|---|---|
| Code 39 | Barcode.CreateCode39(...) |
Supports standard Code 39 alphabet, optional Mod 43 checksum |
| Code 93 | Barcode.CreateCode93(...) |
Supports standard and extended Code 93 character encoding |
| Code 128 | Barcode.CreateCode128(...) |
Supports Code Set B and automatic switching to Code Set C for numeric runs |
| EAN-8 | Barcode.CreateEan8(...) |
Supports 7/8-digit payloads and optional 2/5-digit add-on extension |
| EAN-13 | Barcode.CreateEan13(...) |
Supports 12/13-digit payloads and optional 2/5-digit add-on extension |
| UPC-A | Barcode.CreateUpcA(...) |
Supports 11/12-digit payloads and optional 2/5-digit add-on extension |
| Codabar | Barcode.CreateCodabar(...) |
Supports standard Codabar payload characters and configurable start/stop guards |
| ITF | Barcode.CreateItf(...) |
Supports numeric payloads with an even number of digits |
Usage
The types are in the Meziantou.Framework namespace.
Generate QR codes (Standard, Micro QR, rMQR)
// Standard QR code
var standardQr = QRCode.Create("HELLO WORLD", ErrorCorrectionLevel.H);
// Micro QR code (smaller, single finder pattern)
var microQr = QRCode.CreateMicroQR("12345", ErrorCorrectionLevel.L);
// Rectangular Micro QR code (narrow rectangular shape)
var rmqr = QRCode.CreateRMQR("https://www.meziantou.net", ErrorCorrectionLevel.M);
// Format info: type, width and height in modules
Assert.Equal((QRCodeType.Standard, 25, 25), (standardQr.Type, standardQr.Width, standardQr.Height));
Assert.Equal((QRCodeType.MicroQR, 11, 11), (microQr.Type, microQr.Width, microQr.Height));
Assert.Equal((QRCodeType.RMQR, 43, 13), (rmqr.Type, rmqr.Width, rmqr.Height));
Generate barcodes (Code 39, Code 93, Code 128, EAN/UPC, Codabar, ITF)
var code39 = Barcode.CreateCode39("ABC-123", includeChecksum: true);
var code93 = Barcode.CreateCode93("ABC123");
var code128 = Barcode.CreateCode128("SKU-123456");
var ean8 = Barcode.CreateEan8("5512345");
var ean13 = Barcode.CreateEan13("400638133393");
var upcA = Barcode.CreateUpcA("03600029145", extension: "12");
var codabar = Barcode.CreateCodabar("40156", startCharacter: 'A', stopCharacter: 'B');
var itf = Barcode.CreateItf("12345678");
// Type, width in modules and height (a linear barcode is one module high)
Assert.Equal((BarcodeType.Code39, 129, 1), (code39.Type, code39.Width, code39.Height));
Assert.Equal((BarcodeType.Code93, 91, 1), (code93.Type, code93.Width, code93.Height));
Assert.Equal((BarcodeType.Code128, 123, 1), (code128.Type, code128.Width, code128.Height));
Assert.Equal((BarcodeType.Ean8, 67, 1), (ean8.Type, ean8.Width, ean8.Height));
Assert.Equal((BarcodeType.Ean13, 95, 1), (ean13.Type, ean13.Width, ean13.Height));
Assert.Equal((BarcodeType.UpcA, 122, 1), (upcA.Type, upcA.Width, upcA.Height));
Assert.Equal((BarcodeType.Codabar, 71, 1), (codabar.Type, codabar.Width, codabar.Height));
Assert.Equal((BarcodeType.Itf, 81, 1), (itf.Type, itf.Width, itf.Height));
Render as SVG
var qrCode = QRCode.Create("HELLO WORLD", ErrorCorrectionLevel.H);
var microQr = QRCode.CreateMicroQR("12345", ErrorCorrectionLevel.L);
var barcode = Barcode.CreateCode128("SKU-123456");
var svg = qrCode.ToSvg();
Assert.StartsWith("<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 330 330\">", svg);
var microSvg = microQr.ToSvg(new QRCodeSvgOptions { ModuleSize = 2, QuietZoneModules = 2 });
Assert.Contains("viewBox=\"0 0 30 30\"", microSvg);
var customSvg = qrCode.ToSvg(new QRCodeSvgOptions
{
ModuleSize = 10,
QuietZoneModules = 4,
DarkColor = Color.FromRgb(0x00, 0x00, 0x00),
LightColor = Color.FromRgb(0xff, 0xff, 0xff),
LogoImageHref = "https://example.com/logo.svg", // Also supports data URIs
LogoSizePercent = 20,
});
Assert.Contains("<image href=\"https://example.com/logo.svg\"", customSvg);
var barcodeSvg = barcode.ToSvg(new BarcodeSvgOptions
{
ModuleWidth = 2,
ModuleHeight = 80,
QuietZoneModules = 10,
});
Assert.Contains("viewBox=\"0 0 286 80\"", barcodeSvg);
Logo images are currently supported in the SVG renderer only.
Render as PNG
var qrCode = QRCode.Create("HELLO WORLD", ErrorCorrectionLevel.H);
var microQr = QRCode.CreateMicroQR("12345", ErrorCorrectionLevel.L);
var barcode = Barcode.CreateCode39("ABC-123", includeChecksum: true);
// The content of a PNG file, to save with File.WriteAllBytes("qrcode.png", png)
var png = qrCode.ToPng();
Assert.Equal([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A], png[..8]); // the PNG signature
// Any writable stream, such as File.Create("micro-qrcode.png")
using var stream = new MemoryStream();
microQr.WriteToPng(stream, new QRCodePngOptions
{
ModuleSize = 4,
QuietZoneModules = 2,
DarkColor = Color.FromRgb(0x1f, 0x29, 0x37),
LightColor = Color.FromRgb(0xf9, 0xfa, 0xfb),
});
var barcodePng = barcode.ToPng(new BarcodePngOptions
{
ModuleWidth = 2,
ModuleHeight = 80,
DarkColor = Color.FromRgb(0x0f, 0x76, 0x6e),
LightColor = Color.FromRgb(0xec, 0xfe, 0xff),
});
Render to console
var qrCode = QRCode.Create("HELLO WORLD", ErrorCorrectionLevel.H);
var microQr = QRCode.CreateMicroQR("12345", ErrorCorrectionLevel.L);
qrCode.WriteToConsole();
var text = qrCode.ToConsoleString();
var microText = microQr.ToConsoleString(new QRCodeConsoleOptions
{
QuietZoneModules = 1,
ModuleWidth = 2,
ModuleHeight = 2, // 2x bigger output that can look more square on many terminals
});
Assert.Equal("""
██████████████ ██ ██
██ ██
██ ██████ ██ ██████
██ ██████ ██
██ ██████ ██ ██████
██ ██ ████
██████████████ ██
██████
████ ██████ ████
██ ██ ████
████████ ████
""", microText, ignoreLineEndingDifferences: true);
Content helpers
// WiFi
var wifi = QRCodePayload.Wifi("MyNetwork", "password123", WifiAuthentication.WPA);
Assert.Equal("WIFI:T:WPA;S:MyNetwork;P:password123;;", wifi);
// vCard
var vcard = QRCodePayload.VCard("Doe", "John", phone: "+1234567890", email: "john@example.com");
Assert.StartsWith("BEGIN:VCARD\r\nVERSION:3.0\r\nN:Doe;John;;;\r\nFN:John Doe\r\n", vcard);
// MeCard (compact contact format)
var mecard = QRCodePayload.MeCard("Doe", "John", phone: "+1234567890");
Assert.Equal("MECARD:N:Doe,John;TEL:+1234567890;;", mecard);
// Email
var email = QRCodePayload.Email("test@example.com", subject: "Hello");
Assert.Equal("mailto:test@example.com?subject=Hello", email);
// Phone
var phone = QRCodePayload.Phone("+1234567890");
Assert.Equal("tel:+1234567890", phone);
// SMS
var sms = QRCodePayload.Sms("+1234567890", "Hello!");
Assert.Equal("smsto:+1234567890:Hello!", sms);
// Geolocation
var geo = QRCodePayload.Geolocation(48.8566, 2.3522);
Assert.Equal("geo:48.8566,2.3522", geo);
// Calendar event
var evt = QRCodePayload.CalendarEvent("Meeting",
new DateTime(2025, 6, 15, 14, 0, 0, DateTimeKind.Utc),
new DateTime(2025, 6, 15, 15, 0, 0, DateTimeKind.Utc),
location: "Room 42");
Assert.Contains("DTSTART:20250615T140000Z\r\n", evt);
// OTP Auth (2FA setup)
var otp = QRCodePayload.OneTimePassword(OneTimePasswordType.Totp,
"JBSWY3DPEHPK3PXP", "user@example.com", issuer: "MyApp");
Assert.Equal("otpauth://totp/MyApp:user%40example.com?secret=JBSWY3DPEHPK3PXP&issuer=MyApp", otp);
// Bitcoin payment
var btc = QRCodePayload.Bitcoin("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa", amount: 0.05m);
Assert.Equal("bitcoin:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa?amount=0.05", btc);
// SEPA payment (EPC QR)
var sepa = QRCodePayload.SepaPayment("Example", "DE00000000000000000000", 12.50m,
remittanceText: "Donation");
Assert.StartsWith("BCD\n002\n1\nSCT\n", sepa);
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. net11.0 is compatible. |
-
net10.0
- No dependencies.
-
net11.0
- No dependencies.
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Meziantou.Framework.QRCode:
| Package | Downloads |
|---|---|
|
Meziantou.Framework.QRCode.Imaging
Renders QR codes and barcodes of Meziantou.Framework.QRCode as Meziantou.Framework.Imaging images |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.0.4 | 18 | 10/21/2026 |
| 2.0.3 | 204 | 9/6/2026 |
| 2.0.2 | 139 | 8/29/2026 |
| 2.0.1 | 236 | 7/8/2026 |
| 2.0.0 | 160 | 7/5/2026 |
| 1.0.12 | 170 | 6/28/2026 |
| 1.0.11 | 151 | 6/13/2026 |
| 1.0.10 | 140 | 6/7/2026 |
| 1.0.9 | 191 | 5/23/2026 |
| 1.0.8 | 132 | 5/17/2026 |
| 1.0.7 | 142 | 5/15/2026 |
| 1.0.6 | 137 | 5/14/2026 |
| 1.0.5 | 164 | 4/25/2026 |
| 1.0.4 | 146 | 4/9/2026 |
| 1.0.3 | 129 | 4/9/2026 |
| 1.0.2 | 131 | 4/9/2026 |
| 1.0.1 | 128 | 4/9/2026 |
| 1.0.0 | 147 | 4/8/2026 |