Cross-platform .NET library for QR Code generation using SkiaSharp. Compatible with Windows, Linux, macOS, and mobile (Xamarin / MAUI).
- Installation
- Quick Start
- Output Formats
- Payloads (Content Types)
- Advanced Settings
- Supported Platforms
dotnet add package QRCoder.CoreOr via NuGet Package Manager:
Install-Package QRCoder.Core
SkiaSharp requires native libraries for each platform. QRCoder.Core automatically includes the correct dependencies:
| Platform | Native Package |
|---|---|
| Linux | SkiaSharp.NativeAssets.Linux |
| macOS | SkiaSharp.NativeAssets.macOS |
| Windows | SkiaSharp.NativeAssets.Win32 |
| Android | SkiaSharp.NativeAssets.Android |
| iOS | SkiaSharp.NativeAssets.iOS |
using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
// 1. Create the generator
using var generator = new QRCodeGenerator();
// 2. Generate QR Code data
using var data = generator.CreateQrCode("https://github.com/afonsoft/QRCoder.Core",
QRCodeGenerator.ECCLevel.M);
// 3. Render as image
using var qrCode = new QRCode(data);
using var image = qrCode.GetGraphic(10); // 10 pixels per module
// 4. Save as PNG
using var stream = File.OpenWrite("qrcode.png");
image.Encode(stream, SKEncodedImageFormat.Png, 100);Generates an SKBitmap with the QR Code rendered via SkiaSharp.
using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
using var generator = new QRCodeGenerator();
using var data = generator.CreateQrCode("Hello World!", QRCodeGenerator.ECCLevel.H);
using var qr = new QRCode(data);
// Default black and white
using var bmp = qr.GetGraphic(10);
// Custom colors
using var colorBmp = qr.GetGraphic(10, SKColors.DarkBlue, SKColors.LightGray, true);
// Using hex colors
using var hexBmp = qr.GetGraphic(10, "#1a1a2e", "#e0e0e0");
// With centered logo
using var logo = SKBitmap.Decode("logo.png");
using var logoBmp = qr.GetGraphic(10, SKColors.Black, SKColors.White,
icon: logo, iconSizePercent: 15, iconBorderWidth: 2);Generates the QR Code directly as a PNG byte array — ideal for APIs and web services.
using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
using var generator = new QRCodeGenerator();
using var data = generator.CreateQrCode("API Data", QRCodeGenerator.ECCLevel.M);
using var png = new PngByteQRCode(data);
// Default black and white
byte[] pngBytes = png.GetGraphic(5);
File.WriteAllBytes("qrcode.png", pngBytes);
// With custom colors (RGB)
byte[] darkColor = new byte[] { 0, 0, 128 }; // Dark blue
byte[] lightColor = new byte[] { 255, 255, 200 }; // Light yellow
byte[] colorBytes = png.GetGraphic(5, darkColor, lightColor);
// With transparency (RGBA)
byte[] darkAlpha = new byte[] { 0, 0, 0, 255 };
byte[] lightAlpha = new byte[] { 255, 255, 255, 128 }; // Semi-transparent
byte[] alphaBytes = png.GetGraphic(5, darkAlpha, lightAlpha);Generates the QR Code as an SVG string — perfect for web and vector documents.
using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
using var generator = new QRCodeGenerator();
using var data = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.Q);
using var svg = new SvgQRCode(data);
// Default SVG
string svgString = svg.GetGraphic(10);
File.WriteAllText("qrcode.svg", svgString);
// With custom colors
string colorSvg = svg.GetGraphic(10, SKColors.DarkRed, SKColors.White);
// With specific viewBox size
string viewBoxSvg = svg.GetGraphic(new Size(200, 200));
// Without quiet zone
string noBorderSvg = svg.GetGraphic(10, SKColors.Black, SKColors.White, false);
// With embedded SVG logo
string svgLogo = File.ReadAllText("logo.svg");
var logoObj = new SvgQRCode.SvgLogo(svgLogo, 15);
string logoSvg = svg.GetGraphic(10, SKColors.Black, SKColors.White, logo: logoObj);Generates the QR Code as Base64-encoded string — useful for embedding in HTML/CSS.
using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
using var generator = new QRCodeGenerator();
using var data = generator.CreateQrCode("Base64 Data", QRCodeGenerator.ECCLevel.M);
using var b64 = new Base64QRCode(data);
// PNG as Base64
string base64Png = b64.GetGraphic(5);
// JPEG as Base64
string base64Jpeg = b64.GetGraphic(5, SKColors.Black, SKColors.White,
true, Base64QRCode.ImageType.Jpeg);
// Use in HTML
string htmlImg = $"<img src=\"data:image/png;base64,{base64Png}\" alt=\"QR Code\" />";Generates the QR Code as a PDF document in bytes.
using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
using var generator = new QRCodeGenerator();
using var data = generator.CreateQrCode("PDF Document", QRCodeGenerator.ECCLevel.M);
using var pdf = new PdfByteQRCode(data);
// Default PDF
byte[] pdfBytes = pdf.GetGraphic(5);
File.WriteAllBytes("qrcode.pdf", pdfBytes);
// With custom colors and DPI
byte[] colorPdf = pdf.GetGraphic(5, "#000080", "#FFFFFF", 300, 95);Generates the QR Code as ASCII text — useful for terminal output and logs.
using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
using var generator = new QRCodeGenerator();
using var data = generator.CreateQrCode("Terminal QR", QRCodeGenerator.ECCLevel.L);
using var ascii = new AsciiQRCode(data);
// Default
string text = ascii.GetGraphic(1);
Console.WriteLine(text);
// Custom symbols
string custom = ascii.GetGraphic(1, "██", " ", true);
// Get line by line
string[] lines = ascii.GetLineByLineGraphic(1);
foreach (var line in lines)
Console.WriteLine(line);
// Via helper (one-liner)
string result = AsciiQRCodeHelper.GetQRCode("Quick!", 1, "██", " ",
QRCodeGenerator.ECCLevel.M);Generates the QR Code in Postscript or EPS format.
using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
using var generator = new QRCodeGenerator();
using var data = generator.CreateQrCode("Print Quality", QRCodeGenerator.ECCLevel.M);
using var ps = new PostscriptQRCode(data);
// Standard Postscript
string postscript = ps.GetGraphic(5);
File.WriteAllText("qrcode.ps", postscript);
// EPS format
string eps = ps.GetGraphic(5, epsFormat: true);
File.WriteAllText("qrcode.eps", eps);
// With colors
string colorPs = ps.GetGraphic(5, "#FF0000", "#FFFFFF");
// With viewBox
string viewBoxPs = ps.GetGraphic(new Size(200, 200));Generates QR Codes with artistic styling (dots instead of squares).
using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
using var generator = new QRCodeGenerator();
using var data = generator.CreateQrCode("Artistic QR", QRCodeGenerator.ECCLevel.H);
using var art = new ArtQRCode(data);
// Default (rounded dots)
using var bmp = art.GetGraphic(10);
// With custom pixel size (0.0 to 1.0)
using var smallBmp = art.GetGraphic(10, SKColors.Black, SKColors.White,
SKColors.Transparent, pixelSizeFactor: 0.5);
// With background image
using var background = SKBitmap.Decode("background.png");
using var bgBmp = art.GetGraphic(background);
// With custom finder pattern
using var finder = SKBitmap.Decode("finder.png");
using var customBmp = art.GetGraphic(10, SKColors.Black, SKColors.White,
SKColors.Transparent, finderPatternImage: finder);Generates the QR Code as a Windows Bitmap byte array.
using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
using var generator = new QRCodeGenerator();
using var data = generator.CreateQrCode("BMP test", QRCodeGenerator.ECCLevel.M);
using var bmp = new SKBitmapByteQRCode(data);
// Default
byte[] bmpBytes = bmp.GetGraphic(5);
// With hex colors
byte[] colorBytes = bmp.GetGraphic(5, "#FF0000", "#00FF00");
// Via helper
byte[] helperBytes = SKBitmapByteQRCodeHelper.GetQRCode("Quick!", 5,
"#000000", "#FFFFFF", QRCodeGenerator.ECCLevel.M);The PayloadGenerator creates structured content for various QR Code types:
using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
var wifi = new PayloadGenerator.WiFi("MyNetwork", "MyPassword123",
PayloadGenerator.WiFi.Authentication.WPA);
string content = wifi.ToString();
// Hidden network
var hiddenWifi = new PayloadGenerator.WiFi("HiddenNet", "Password",
PayloadGenerator.WiFi.Authentication.WPA, isHiddenSSID: true);using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
var url = new PayloadGenerator.Url("https://github.com/afonsoft/QRCoder.Core");
string content = url.ToString();using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
var email = new PayloadGenerator.Mail("contact@example.com",
"Email Subject", "Message body");
string content = email.ToString();using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
var sms = new PayloadGenerator.SMS("+1234567890", "Hello via QR Code!");
string content = sms.ToString();using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
var phone = new PayloadGenerator.PhoneNumber("+1234567890");
string content = phone.ToString();
// Result: tel:+1234567890using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
var geo = new PayloadGenerator.Geolocation("40.7128", "-74.0060");
string content = geo.ToString();
// Result: geo:40.7128,-74.0060using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
var btc = new PayloadGenerator.BitcoinAddress(
"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
amount: 0.001,
label: "Donation",
message: "Thank you for your support!");
string content = btc.ToString();using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
var contact = new PayloadGenerator.ContactData(
PayloadGenerator.ContactData.ContactOutputType.VCard3,
firstname: "John",
lastname: "Doe",
org: "Example Corp",
email: "john@example.com",
phone: "+1234567890",
street: "123 Main Street",
city: "New York",
stateRegion: "NY",
country: "United States");
string content = contact.ToString();using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
var calEvent = new PayloadGenerator.CalendarEvent(
"Team Meeting",
"Event description",
"Room 101",
new DateTime(2026, 06, 15, 14, 0, 0),
new DateTime(2026, 06, 15, 15, 0, 0),
true);
string content = calEvent.ToString();| Level | Recovery Capacity | Recommended For |
|---|---|---|
| L | ~7% | Simple data, short URLs |
| M | ~15% | General use (default) |
| Q | ~25% | QR Codes with logos |
| H | ~30% | High-wear environments |
using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
using var generator = new QRCodeGenerator();
using var data = generator.CreateQrCode("Serializable data", QRCodeGenerator.ECCLevel.M);
// Save to file
data.SaveRawData("data.qrr", QRCodeData.Compression.GZip);
// Load from file
using var loadedData = new QRCodeData("data.qrr", QRCodeData.Compression.GZip);
// Serialize to bytes
byte[] rawBytes = data.GetRawData(QRCodeData.Compression.Deflate);
// Deserialize from bytes
using var fromBytes = new QRCodeData(rawBytes, QRCodeData.Compression.Deflate);using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
using var generator = new QRCodeGenerator();
// Force UTF-8 encoding with BOM
using var data = generator.CreateQrCode("Text with special characters",
QRCodeGenerator.ECCLevel.M,
forceUtf8: true,
utf8BOM: true);using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
using var generator = new QRCodeGenerator();
// Force QR Code version 10 (57x57 modules)
using var data = generator.CreateQrCode("Text",
QRCodeGenerator.ECCLevel.M,
requestedVersion: 10);| Framework | Version | Status |
|---|---|---|
| .NET Standard | 2.1 | Supported |
| .NET | 8.0 | Supported |
| .NET | 10.0 | Supported |
| .NET Framework | 4.8 | Supported |
| Xamarin.Android | - | Via SkiaSharp |
| Xamarin.iOS | - | Via SkiaSharp |
| .NET MAUI | - | Via SkiaSharp |
using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
[HttpGet("qrcode")]
public IActionResult GenerateQRCode([FromQuery] string text)
{
using var generator = new QRCodeGenerator();
using var data = generator.CreateQrCode(text, QRCodeGenerator.ECCLevel.M);
using var png = new PngByteQRCode(data);
byte[] bytes = png.GetGraphic(5);
return File(bytes, "image/png");
}using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
public ImageSource GenerateQRCodeImage(string text)
{
using var generator = new QRCodeGenerator();
using var data = generator.CreateQrCode(text, QRCodeGenerator.ECCLevel.M);
using var png = new PngByteQRCode(data);
byte[] bytes = png.GetGraphic(5);
return ImageSource.FromStream(() => new MemoryStream(bytes));
}using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
using var generator = new QRCodeGenerator();
using var data = generator.CreateQrCode("Terminal!", QRCodeGenerator.ECCLevel.L);
using var ascii = new AsciiQRCode(data);
Console.WriteLine(ascii.GetGraphic(1));