QRCoder 是 C# 中最轻量、活跃且稳定的二维码生成库,三行代码即可生成 PNG/SVG,不依赖 System.Drawing,支持 UTF-8 和多级容错,但原生不支持着色或加 logo。

用 QRCoder 库最直接,NuGet 安装后三行代码就能出图
不用自己实现 Reed-Solomon 编码或掩码逻辑,QRCoder 是目前 C# 生态中最轻量、维护活跃、且输出稳定的开源库。它不依赖 System.Drawing(避免 Linux 上的 GDI+ 问题),默认输出 Bitmap 或可选 SVG/PNG 字节数组。
安装命令:
dotnet add package QRCoder
基础用法示例:
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.Q);
var qrCode = new PngByteQRCode(qrData);
byte[] pngBytes = qrCode.GetGraphic(20); // 每模块20像素,输出PNG字节数组-
GetGraphic(20)的参数是「每个二维码模块(module)对应的像素数」,不是总宽高;设太小会糊,设太大可能溢出内存(尤其含中文时) - 中文内容需确保编码为 UTF-8 ——
CreateQrCode默认处理,但若传入 byte[] 要自己保证 - 若目标是 Web API 返回图片,直接用
File(pngBytes, "image/png")即可,无需额外保存文件
想自定义颜色、加 logo 或调整容错等级?用 QRCodeGenerator.Options
默认白底黑码太单调,但 QRCoder 原生不支持着色或嵌入 logo;得靠后续图像处理。不过容错等级、编码模式、最小版本等关键参数必须在生成前指定。
例如提高容错并强制 UTF-8 编码:
PHP QR Code 是一个开源(LGPL)的库,用于生成 QR Code,即二维码。基于 libqrencode C 库,提供了创建 QR Code 条形码图像的 API(PNG、JPEG 依赖于 GD2)。完全使用 PHP 实现。
var options = new QRCodeGenerator.Options
{
ECCLevel = QRCodeGenerator.ECCLevel.H, // 最高容错(30% 损毁仍可读)
EncodingHint = QRCodeGenerator.EncodingHint.UTF8,
Version = 1 // 强制最小版本(仅当内容极短时有用)
};
var qrData = qrGenerator.CreateQrCode("你好", options);-
ECCLevel.L(7%)适合静态张贴;H适合手机扫码场景,但二维码会变大 -
Version手动设太小会导致ArgumentException: Data too long,让库自动选择更安全 - 要加 logo?得用
System.Drawing或SixLabors.ImageSharp把生成的Bitmap再加工 —— 注意别盖住定位图案(三个角上的「回」字)
部署到 Linux 容器时报 System.Drawing.Common 错误?换 ImageSharp 渲染路径
QRCoder 的 BitmapByteQRCode 类内部用了 System.Drawing,.NET 6+ 在非 Windows 上默认禁用该组件,会抛 PlatformNotSupportedException。
解法:跳过 Bitmap,改用纯内存 PNG 渲染器:
var qrCode = new PngByteQRCode(qrData); // ✅ 不依赖 System.Drawing byte[] pngBytes = qrCode.GetGraphic(15);
- 只要不用
BitmapQRCode或BitmapByteQRCode,就完全规避 GDI+ 问题 - 如果非要用
ImageSharp自定义样式(比如圆角模块、渐变色),先用PngByteQRCode拿到原始 PNG 字节,再用Image.Load()解析加工 - 别在 ASP.NET Core 中调用
Graphics.FromImage—— 即使加了System.Drawing.Common包,容器里也大概率崩溃
生成速度慢或内存暴涨?检查内容长度和模块尺寸
二维码体积与数据长度、ECC 等级、模块尺寸呈指数关系。一个 500 字符的 JSON 字符串 + ECCLevel.H + GetGraphic(50) 可能生成 10MB+ 的 PNG。
- 普通 URL 建议模块尺寸 ≤ 25;含中文或 Base64 数据时,优先降
ECCLevel到M或Q - 用
qrData.ModuleMatrix可提前拿到二维 bool 数组,自己估算渲染后大小(宽高 = 矩阵边长 × 模块尺寸) - 高频调用场景(如订单页批量生成),把
QRCodeGenerator实例复用,不要每次 new
真正卡住的地方往往不是“怎么画”,而是没意识到二维码本质是「数据密度 × 渲染精度」的乘积——控制好这两头,比换库更管用。









